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принимает любое значение перечисления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 | Метаданные канала/маски/смешивания только для чтения |