Layers
Layers
PsdImage.Layers هر لایه تجزیهشدهای را بهصورت یک آرایه Layer برمیگرداند. هر Layer هندسه، قابلیت مشاهده و وضعیت ترکیب خود را و همچنین فرادادههای مربوط به کانالها، ماسک و blending ranges افشا میکند.
خواندن متادیتای لایه
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 | این ۳ ویژگی در نسخهٔ FOSS فقط-خواندنی هستند، علیرغم اینکه setter دارند | مقدار را بخوانید؛ سعی نکنید آن را مجدداً اختصاص دهید |
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 | متادیتای کانال/ماسک/ترکیب فقطخواندنی |