Как работать с PSD-слоями в .NET
Это руководство показывает, как вывести список слоёв документа, читать и изменять редактируемые метаданные слоя, перемещать слой и удалять слой из коллекции. Свойство Layers загруженного PsdImage возвращает его коллекцию объектов Layer. Каждый Layer предоставляет редактируемые метаданные — имя, видимость, непрозрачность, обрезка, режим наложения и позицию (границы) — а также только для чтения общие границы и информацию о каналах.
Пошаговое руководство
Шаг 1: Установить пакет
git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-.NET.git
cd Aspose.PSD-FOSS-for-.NET
dotnet buildШаг 2: Импортировать требуемые классы
Методы расширения LINQ, используемые далее (Where), берутся из System.Linq; типы, специфичные для PSD, берутся из двух пространств имён Aspose.PSD, указанных ниже.
using System.Linq;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Core.Blending;Шаг 3: Загрузить документ и перечислить его слои
Загрузите документ, затем переберите Layers, чтобы увидеть имя и геометрию каждого слоя:
using var image = PsdImage.Load("input.psd");
foreach (var layer in image.Layers)
{
Console.WriteLine($"{layer.Name}: {layer.Width}x{layer.Height} at ({layer.Left},{layer.Top})");
}Шаг 4: Читать и изменять видимость слоя, непрозрачность и режим наложения
IsVisible, Opacity (0-255), Clipping, Name и BlendModeKey все имеют работающие сеттеры:
var layer = image.Layers[0];
layer.IsVisible = false; // hide the layer
layer.Opacity = 200; // ~78% opacity
layer.BlendModeKey = BlendMode.Multiply;
layer.Name = "Renamed Layer";Шаг 5: Читать и перемещать границы слоя
Bounds, Width, Height и ChannelsCount только для чтения — но Top, Left, Bottom и Right каждый имеют работающий сеттер, который перемещает слой:
Console.WriteLine($"Bounds: {layer.Bounds}");
Console.WriteLine($"Channels: {layer.ChannelsCount}");
layer.Left = 10;
layer.Top = 20;
layer.Right = 40;
layer.Bottom = 60;Шаг 6: Заменить коллекцию слоёв
PsdImage.Layers сам имеет работающий сеттер, так что вы можете заменить всю коллекцию (например, чтобы удалить слой):
image.Layers = image.Layers.Where(l => l.Name != "Renamed Layer").ToArray();Шаг 7: Сохранить документ
Сохраните все изменения, сделанные на предыдущих шагах, на диск:
image.Save("output.psd");Общие проблемы и исправления
NotSupportedException при установке ChannelInformation, LayerMaskData, или LayerBlendingRangesData. Эти три Layer сеттеры не поддерживаются в этой сборке FOSS — рассматривайте их как только для чтения.
Значение непрозрачности выглядит неверным после его установки. Opacity это byte (0-255), а не 0.0-1.0 дробь или процент — layer.Opacity = 200 означает примерно 78% непрозрачности (200/255).
Изменения в слое не отображаются после сохранения. Убедитесь, что вы изменяете Layer экземпляр, полученный из image.Layers, и что вы вызываете image.Save после внесения правок.
Часто задаваемые вопросы
Могу ли я удалить слой из документа?
Да — PsdImage.Layers имеет работающий сеттер, поэтому вы можете присвоить ему отфильтрованный массив для удаления слоёв (см. шаг 6).
Какие режимы наложения доступны?
BlendMode включает значения, такие как Normal, Multiply, Screen, Overlay и Darken, среди прочих — задаётся через Layer.BlendModeKey.
Доступны ли данные маски слоя?
Layer.LayerMaskData имеет работающий геттер, но его сеттер бросает NotSupportedException в этой FOSS-сборке.