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

См. также:

 Русский