如何在 .NET 中使用 PSD 图层

如何在 .NET 中使用 PSD 图层

本指南展示了如何列出文档的图层、读取和更改可编辑的图层元数据、重新定位图层以及从集合中移除图层。已加载的 PsdImage 的 Layers 属性返回其 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 都具有可用的 setter:

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 每个都有可用的 setter,可重新定位图层:

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 本身具有可用的 setter,因此您可以替换整个集合(例如,移除某个图层):

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 有可用的 setter,因此您可以为其分配过滤后的数组来删除图层(参见步骤 6)。

有哪些混合模式可用?

BlendMode 包含诸如 Normal、Multiply、Screen、Overlay 和 Darken 等值——通过 Layer.BlendModeKey 设置。

图层蒙版数据可用吗?

Layer.LayerMaskData 有可用的 getter,但在此 FOSS 构建中,它的 setter 会抛出 NotSupportedException。

另请参阅

 中文