Как работать с PSD-слоями в .NET

Как работать с 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-сборке.

См. также:

 Русский