Layers

Layers

PsdImage.Layers คืนค่าทุกเลเยอร์ที่ทำการแยกวิเคราะห์เป็นอาร์เรย์ Layer. แต่ละ Layer จะเปิดเผยเรขาคณิตของมันเอง, การมองเห็นและสถานะการผสม, รวมถึงเมตาดาต้าเกี่ยวกับช่องสัญญาณ, มาสก์, และช่วงการผสมสี.


อ่านเมตาดาต้าเลเยอร์

Name, Bounds (และ Width/Height/Top/Left/Bottom/Right ที่สืบทอด), IsVisible, Opacity, Clipping, BlendModeKey, และ ChannelsCount สามารถอ่านได้โดยตรง.

foreach (Layer layer in image.Layers)
{
    Console.WriteLine($"{layer.Name}: {layer.Bounds}, " +
                       $"Visible={layer.IsVisible}, Opacity={layer.Opacity}, " +
                       $"BlendMode={layer.BlendModeKey}");
}

การแก้ไขเมตาดาต้าที่รองรับ

Name, IsVisible, Opacity, Clipping, BlendModeKey, และขอบพิกัดสี่ด้าน (Top/Left/Bottom/Right) สามารถเปลี่ยนแปลงได้ในที่เดิมและเขียนกลับด้วย PsdImage.Save().

Layer layer = image.Layers[0];
layer.Name = $"{layer.Name} (edited)";
layer.IsVisible = !layer.IsVisible;
layer.Opacity = 128;
layer.BlendModeKey = BlendMode.Multiply;
image.Save(outputPath);

เมตาดาต้าช่องสัญญาณและมาสก์

ChannelInformation, LayerMaskData และ LayerBlendingRangesData เป็นแบบอ่านอย่างเดียวในรุ่น FOSS นี้ — ตัวตั้งค่าของพวกมันจะโยน NotSupportedException.

foreach (ChannelInformation channel in layer.ChannelInformation)
{
    Console.WriteLine($"Channel {channel.ChannelID}: {channel.CompressionMethod}, {channel.Length} bytes");
}

if (layer.LayerMaskData is { } mask)
{
    Console.WriteLine($"Mask bounds: {mask.MaskRectangle}, flags: {mask.Flags}");
}

การลบหรือจัดลำดับชั้นใหม่

PsdImage.Layers มีตัวตั้งค่าและตัวดึงค่า: การกำหนดอาร์เรย์ที่ผ่านการกรองหรือจัดลำดับใหม่จะทดแทนคอลเลกชันชั้นของเอกสาร ไม่มีวิธีสาธารณะในการสร้างอินสแตนซ์ Layer ใหม่ทั้งหมด ดังนั้นฟีเจอร์นี้จึงรองรับเพียงการลบหรือจัดลำดับชั้นที่มีอยู่แล้ว — ไม่ใช่การเพิ่มชั้นใหม่ตั้งแต่ต้น.

// Keep only visible layers
image.Layers = image.Layers.Where(layer => layer.IsVisible).ToArray();
image.Save(outputPath);

เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด

  • เข้าถึง image.Layers ตามตำแหน่ง; ลำดับของอาร์เรย์ตรงกับลำดับชั้นของเอกสารเอง.
  • BlendModeKey ยอมรับค่า enum BlendMode ใด ๆ — ไม่มีการตรวจสอบความถูกต้องกับโหมดสีที่ประกาศในเอกสาร.
  • ChannelInformation, LayerMaskData และ LayerBlendingRangesData สามารถอ่านได้แต่ไม่สามารถกำหนดค่าใหม่ได้.
  • เรียก PsdImage.Save() หนึ่งครั้งหลังจากการแก้ไขทั้งหมด; ทุกการเรียกจะเขียนเอกสารทั้งหมด.

ปัญหาทั่วไป

ปัญหาสาเหตุวิธีแก้ไข
NotSupportedException ขณะตั้งค่า ChannelInformation, LayerMaskData หรือ LayerBlendingRangesDataคุณสมบัติเหล่านี้ 3 รายการเป็นแบบอ่านอย่างเดียวในรุ่น FOSS แม้ว่าจะมีตัวตั้งค่าอ่านค่าที่ได้; อย่าพยายามกำหนดค่าใหม่
LayerMaskData คือ null สำหรับเลเยอร์ไม่ใช่ทุกเลเยอร์ที่มีส่วนย่อยของมาสก์ตรวจสอบ null ก่อนใช้งาน (layer.LayerMaskData is { } mask)

FAQ

ฉันสามารถลบเลเยอร์ได้หรือไม่?

ใช่ — กำหนดค่า image.Layers ใหม่เป็นอาเรย์ที่กรองแล้ว คุณไม่สามารถเพิ่มเลเยอร์ใหม่ได้ เนื่องจาก Layer ไม่มีคอนสตรัคเตอร์สาธารณะ; สามารถเก็บ, ลบ หรือจัดเรียงลำดับเลเยอร์ที่วิเคราะห์อยู่แล้วเท่านั้น.

ฉันสามารถเปลี่ยนช่องหรือข้อมูลมาสก์ของเลเยอร์ได้หรือไม่?

ไม่. ChannelInformation, LayerMaskData และ LayerBlendingRangesData เป็นแบบอ่านอย่างเดียว — สามารถเปลี่ยนได้เฉพาะ Name, IsVisible, Opacity, Clipping, BlendModeKey และขอบเขตเท่านั้น.


API Reference สรุป

คลาส/เมธอดคำอธิบาย
PsdImage.Layersรับหรือกำหนดชุดชั้น — สามารถตั้งค่าได้เฉพาะสำหรับการลบ/จัดลำดับใหม่เท่านั้น
Layer.Name / IsVisible / Opacity / Clipping / BlendModeKey / Top / Left / Bottom / Rightการแก้ไขเมตาดาต้าชั้นที่รองรับ
Layer.Bounds / Width / Height / ChannelsCountเรขาคณิตของชั้นแบบอ่านอย่างเดียว
Layer.ChannelInformation / LayerMaskData / LayerBlendingRangesDataเมทาดาต้าช่อง/มาสก์/การผสานแบบอ่านอย่างเดียว

ดูเพิ่มเติม

 ภาษาไทย