ภาพรวม
เพื่อออโตเมติกการแก้ไขรูปแบบ PSD และเปลี่ยนไฟล์ PSD โดยไม่ต้องใช้ Adobe® Photoshop® คุณสามารถใช้ Aspose.PSD API ด้านล่างได้ มีโค้ดย่อ C# และ .NET ที่ช่วยให้คุณสามารถแก้ไขไฟล์ PSD
การใช้ PSD Layer และ Vector Masks เราสามารถซ่อนและแสดงพิกเซลของชั้นโดยไม่ลบอย่างถาวร หน้ากากเราสเตอร์เรียกอีกชื่อหนึ่งว่าหน้ากากชั้นหรือหน้ากากผู้ใช้ การเข้าถึงหน้ากากแรสเตอร์และเวกเตอร์ใน Aspose.PSD มีทางเข้าผ่านคุณสมบัติเลเยอร์ LayerMaskDataซึ่งสามารถเป็นตัวอย่างของคลาส ‘LayerMaskDataShort’ และ ‘LayerMaskDataFull’ ที่เป็นคลาสลูกของคลาส ‘LayerMaskData’ อย่างน้อยถ้าเลเยอร์มีทั้งหน้ากากแรสเตอร์และเวกเตอร์ จะมีอินสแตนซ์ของ LayerMaskDataFull ถูกนำมา หากเลเยอร์มีเพียงแค่หน้ากากแรสเตอร์หรือเวกเตอร์ จะมีอินสแตนซ์ของ LayerMaskDataShort ถูกนำมา พรอพเพอร์ตี LayerMaskData ถ้าค่าเป็น null แสดงว่าเลเยอร์ไม่มีหน้ากากหรือมีเพียงหน้ากากเวกเตอร์ที่ปิดการใช้งานอย่างเดียว
![]() |
หน้ากากแรสเตอร์และหน้ากากเวกเตอร์ที่ถูกปิดใช้งาน 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); |
นี้จะลบทั้งหน้ากากและช่อง:
layer.AddLayerMask(null); |
การลบหน้ากากแรสเตอร์ของเลเยอร์ในภาพ 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 และคุณสมบัติอื่นๆ ด้วยคุณสมบัติหน้ากากที่กำหนด โค้ดตัวอย่างวิ