ภาพรวม

เพื่อออโตเมติกการแก้ไขรูปแบบ PSD และเปลี่ยนไฟล์ PSD โดยไม่ต้องใช้ Adobe® Photoshop® คุณสามารถใช้ Aspose.PSD API ด้านล่างได้ มีโค้ดย่อ C# และ .NET ที่ช่วยให้คุณสามารถแก้ไขไฟล์ PSD

การใช้ PSD Layer และ Vector Masks เราสามารถซ่อนและแสดงพิกเซลของชั้นโดยไม่ลบอย่างถาวร หน้ากากเราสเตอร์เรียกอีกชื่อหนึ่งว่าหน้ากากชั้นหรือหน้ากากผู้ใช้ การเข้าถึงหน้ากากแรสเตอร์และเวกเตอร์ใน Aspose.PSD มีทางเข้าผ่านคุณสมบัติเลเยอร์ LayerMaskDataซึ่งสามารถเป็นตัวอย่างของคลาส ‘LayerMaskDataShort’ และ ‘LayerMaskDataFull’ ที่เป็นคลาสลูกของคลาส ‘LayerMaskData’ อย่างน้อยถ้าเลเยอร์มีทั้งหน้ากากแรสเตอร์และเวกเตอร์ จะมีอินสแตนซ์ของ LayerMaskDataFull ถูกนำมา หากเลเยอร์มีเพียงแค่หน้ากากแรสเตอร์หรือเวกเตอร์ จะมีอินสแตนซ์ของ LayerMaskDataShort ถูกนำมา พรอพเพอร์ตี LayerMaskData ถ้าค่าเป็น null แสดงว่าเลเยอร์ไม่มีหน้ากากหรือมีเพียงหน้ากากเวกเตอร์ที่ปิดการใช้งานอย่างเดียว

todo:image_alt_text

หน้ากากแรสเตอร์และหน้ากากเวกเตอร์ที่ถูกปิดใช้งาน LayerMaskDataShort

หน้ากากราชเทอร์ที่ถูกปิดใข้งาน LayerMaskDataShort

หน้ากากแรสเตอร์และหน้ากากเวกเตอร์ LayerMaskDataFull

หน้ากากแรสเตอร์ LayerMaskDataShort

หน้ากากเวกเตอร์ LayerMaskDataShort

หน้ากากเว็คเตอร์ที่ถูกปิดการใช้งาน null (แต่มีทรัพยากรเวกเตอร์)

วิธีการดึงหน้ากากแรสเตอร์ของเลเยอร์ในไฟล์ PSD?

ต้องมั่นใจก่อนว่าเลเยอร์มีทั้งหน้ากากเวกเตอร์และหน้ากากราชเทอร์:

โค้ดตัวอย่างด้านล่างแสดงวิธีการดึงหน้ากากแรสเตอร์ของเลเยอร์

LayerMaskDataFull fullMask = layer.LayerMaskData as LayerMaskDataFull;
if (fullMask != null)
{
var left = fullMask.EnclosingLeft;
var right = fullMask.EnclosingRight;
var top = fullMask.EnclosingTop;
var bottom = fullMask.EnclosingBottom;
var maskRectangle = fullMask.UserMaskRectangle;
var imageData = fullMask.UserMaskData;
var defaultColor = fullMask.BackgroundColor;
var flags = fullMask.RealFlags;
bool isDisabled = (flags & LayerMaskFlags.Disabled) != 0;
}

มิฉะนั้น ประเภทของสมบัติเลเยอร์ LayerMaskData คือ LayerMaskDataShort ในกรณีนี้ มาตรวจสอบว่าเลเยอร์มีหน้ากากแรสเตอร์อย่างเดียวหรือไม่โดยการตรวจสอบสมบัติ Flags ไม่ควรมี LayerMaskFlags.UserMaskFromRenderingOtherData flag มิฉะนั้นหน้ากากก็คือแคชของหน้ากากเวกเตอร์

การดึงโค้ดหน้ากาก:

LayerMaskDataShort mask = (LayerMaskDataShort)layer.LayerMaskData;
if ((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0)
{
var left = fullMask.Left;
var right = fullMask.Right;
var top = fullMask.Top;
var bottom = fullMask.Bottom;
var maskRectangle = mask.MaskRectangle;
var imageData = mask.ImageData;
var defaultColor = newMask.DefaultColor;
var flags = newMask.Flags;
bool isDisabled = (flags & LayerMaskFlags.Disabled) != 0;
}

หากคุณต้องการ ดึงหน้ากากแรสเตอร์ เป็น LayerMaskDataShort (สำหรับการจัดการต่อไป) แม้ว่าทั้งสองหน้ากากจะมีอยู่ LayerMaskDataFull ควรสกัดและแปลงไปเป็น LayerMaskDataShort โค้ดต่อไปนี้สามารถใช้ได้สำหรับทั้งสองกรณี:

การสกัดหน้ากากแรสเตอร์จาก PSD

LayerMaskDataShort GetRasterMask(LayerMaskData mask)
{
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
return null;
}
if (fullMask != null)
{
return new LayerMaskDataShort()
{
Left = fullMask.EnclosingLeft,
Right = fullMask.EnclosingRight,
Top = fullMask.EnclosingTop,
Bottom = fullMask.EnclosingBottom,
ImageData = fullMask.UserMaskData,
DefaultColor = fullMask.DefaultColor,
Flags = fullMask.RealFlags
};
}

การตรวจสอบว่าเลเยอร์ในไฟล์ PSD มีหน้ากากแรสเตอร์หรือไม่?

โค้ด C# ต่อไปนี้อาจช่วยให้คุณตรวจสอบว่าเลเยอร์มีหน้ากากแรสเตอร์หรือไม่:

วิธีตรวจสอบว่าหน้ากากแรสเตอร์ถูกนำไปใช้กับ PSD Layer

bool HasLayerRasterMask(Layer layer)
{
var mask = layer.LayerMaskData;
var fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
return false;
}
return true;
}

วิธีการลบ / เพิ่ม / อัปเดตหน้ากากแรสเตอร์ของเลเยอร์ในไฟล์ PSD?

การลบ / เพิ่ม / อัปเดตเพียงแค่ LayerMaskData ไม่เพียงพอสำหรับการบันทึกให้ถูกต้องเพราะช่องไม่ได้รับการอัพเดท แม้ว่าจะสามารถให้การแสดงผลได้อย่างถูกต้อง นี้ไม่ทำให้ช่องหน้ากากเปลี่ยนไป:

layer.LayerMaskData = newMaskData;

ควรใช้วิธีการเพิ่มเลเยอร์ AddLayerMask สำหรับการลบ / เพิ่ม / อัปเดต

นี้จะเพิ่ม / อัปเดตทั้งหน้ากากและช่อง:

layer.AddLayerMask(newMaskData);

นี้จะลบทั้งหน้ากากและช่อง:

การลบหน้ากากแรสเตอร์ของเลเยอร์ในภาพ PSD

ก่อนอื่นเราตรวจสอบว่าหน้ากากเป็นรูปแบบสั้นและหากมันไม่ใช่หนึ่งเวกเตอร์เราสามารถเรียก AddLayerMask method ด้วย null เพื่อลบหน้ากากแรสเตอร์ แต่หากมันเป็นรูปแบบเต็มเราต้องแปลงเป็นรูปแบบสั้นเพื่อทิ้งเฉพาะหน้ากากเวกเตอร์ไว้เพียงอย่างเดียว สำหรับการลบหน้ากากชั้น ข้อมูลนี้เป็นตัวอย่าง

โค้ดตัวอย่างวิธีการลบหน้ากากชั้นจากไฟล์ PSD

void RemoveRasterMask(Layer layer)
{
LayerMaskData mask = layer.LayerMaskData;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
throw new Exception("This layer has no raster mask.");
}
if (fullMask == null)
{
layer.AddLayerMask(null);
return;
}
var vectorMask = new LayerMaskDataShort();
vectorMask.Flags = fullMask.Flags;
vectorMask.MaskRectangle = fullMask.MaskRectangle;
vectorMask.DefaultColor = fullMask.DefaultColor;
vectorMask.ImageData = fullMask.ImageData;
layer.AddLayerMask(vectorMask);
}

การอัปเดตหน้ากากแรสเตอร์ของเลเยอร์ในภาพ PSD

นี่ คือง่ายต่อการกระทำ: หน้ากากเป็นชนิดสั้นเราต้องเปลี่ยน ImageData และ MaskRectangle ถ้าจำเป็น, มิฉะนั้น UserMaskData และ UserMaskRectangle ควรเปลี่ยน โค้ดตัวอย่างนี้สามารถใช้สำหรับการอัปเดตหน้ากากชั้น:

อัปเดต PSD Layer Mask ด้วย C#

void RemoveRasterMask(Layer layer)
{
LayerMaskData mask = layer.LayerMaskData;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
throw new Exception("This layer has no raster mask.");
}
if (fullMask == null)
{
layer.AddLayerMask(null);
return;
}
var vectorMask = new LayerMaskDataShort();
vectorMask.Flags = fullMask.Flags;
vectorMask.MaskRectangle = fullMask.MaskRectangle;
vectorMask.DefaultColor = fullMask.DefaultColor;
vectorMask.ImageData = fullMask.ImageData;
layer.AddLayerMask(vectorMask);
}

นี่คือตัวอย่างของการกระทำที่เป็นไปได้ที่เปลี่ยนหน้ากากแรสเตอร์ อันนี้กลับด้านหน้าของหน้ากากของเลเยอร์:

อัปเดต PSD Layer Mask ด้วย C#

void InvertMask(LayerMaskData mask)
{
byte[] maskBytes;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (fullMask == null)
{
maskBytes = mask.ImageData;
}
else
{
maskBytes = fullMask.UserMaskData;
}
for (int i = 0; i < maskBytes.Length; i++)
{
maskBytes[i] = (byte)~maskBytes[i];
}
}

การอัปเดตหน้ากากเวกเตอร์ในไฟล์ PSD เมื่อหน้ากากแรสเตอร์ของเลเยอร์มีอยู่

มันถูกคาดว่าผู้ใช้ได้เปลี่ยนโอปเจ็คเวกเตอร์ไปแล้ว จากนั้นนั้นสามารถอัปเดตหน้ากากเวกเตอร์ได้โดยกระทำการเรียก AddLayerMask ต่อเลเยอร์:

อัปเดต PSD Layer Vector Mask ด้วย C#

void UpdateVectorMask(Layer layer)
{
var vectorMask = layer.LayerMaskData;
if (vectorMask == null || (vectorMask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0)
{
throw new Exception("This layer has no vector mask.");
}
layer.AddLayerMask(vectorMask);
}

การเพิ่มหน้ากากแรสเตอร์ของเลเยอร์ในไฟล์ PSD

ถ้าเลเยอร์ไม่มีหน้ากากเราสามารถเพิ่มหน้ากากแรสเตอร์ที่กำหนดโดยการเรียก AddLayerMask layer method

ถ้าหน้ากากไม่มี UserMaskFromRenderingOtherData** flag หมายความว่ามันมีหน้ากากแรสเตอร์อยู่แล้ว และเราต้องอัปเดตมันตามที่ได้อธิบายไว้ข้างบน มิฉะนั้น หากรูปแบบหน้ากากนี้เป็นรูปแบบสั้นเราจะแปลงเป็นรูปแบบเต็ม หากไม่ เราใช้เหมือนเดิม จากนั้นอัปเดต UserMaskData UserMaskRectangle และคุณสมบัติอื่นๆ ด้วยคุณสมบัติหน้ากากที่กำหนด โค้ดตัวอย่างวิ