Cómo trabajar con capas PSD en .NET
Esta guía muestra cómo enumerar las capas de un documento, leer y modificar los metadatos editables de una capa, reposicionar una capa y eliminar una capa de la colección. La propiedad Layers de un PsdImage cargado devuelve su colección de objetos Layer. Cada Layer expone metadatos editables — nombre, visibilidad, opacidad, recorte, modo de fusión y posición (bordes de los límites) — además de los límites generales y la información de canales, que son de solo lectura.
Guía paso a paso
Paso 1: Instalar el paquete
git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-.NET.git
cd Aspose.PSD-FOSS-for-.NET
dotnet buildPaso 2: Importar las clases requeridas
Los métodos de extensión LINQ utilizados más adelante (Where) provienen de System.Linq; los tipos específicos de PSD provienen de los dos espacios de nombres Aspose.PSD que aparecen a continuación.
using System.Linq;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Core.Blending;Paso 3: Cargar un documento y enumerar sus capas
Cargue el documento, luego itere Layers para ver el nombre y la geometría de cada capa:
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})");
}Paso 4: Leer y editar la visibilidad, opacidad y modo de fusión de la capa
Todos IsVisible, Opacity (0-255), Clipping, Name y BlendModeKey tienen setters funcionales:
var layer = image.Layers[0];
layer.IsVisible = false; // hide the layer
layer.Opacity = 200; // ~78% opacity
layer.BlendModeKey = BlendMode.Multiply;
layer.Name = "Renamed Layer";Paso 5: Leer y reposicionar los límites de la capa
Los Bounds, Width, Height y ChannelsCount son de solo lectura — pero Top, Left, Bottom y Right cada uno tiene un setter funcional que reposiciona la capa:
Console.WriteLine($"Bounds: {layer.Bounds}");
Console.WriteLine($"Channels: {layer.ChannelsCount}");
layer.Left = 10;
layer.Top = 20;
layer.Right = 40;
layer.Bottom = 60;Paso 6: Reemplazar la colección de capas
PsdImage.Layers en sí tiene un setter funcional, por lo que puedes reemplazar toda la colección (por ejemplo, para eliminar una capa):
image.Layers = image.Layers.Where(l => l.Name != "Renamed Layer").ToArray();Paso 7: Guardar el documento
Guarda cada edición realizada en los pasos anteriores en el disco:
image.Save("output.psd");Problemas comunes y soluciones
NotSupportedException al establecer ChannelInformation, LayerMaskData, o LayerBlendingRangesData. Estos tres Layer los setters no son compatibles con esta compilación FOSS — trátelos como solo lectura.
El valor de opacidad parece incorrecto después de establecerlo. Opacity es un byte (0-255), no una fracción 0.0-1.0 ni un porcentaje — layer.Opacity = 200 significa aproximadamente un 78% opaco (200/255).
Los cambios en una capa no aparecen después de guardar. Confirma que estás modificando el Layer instancia obtenida de image.Layers, y que llames a image.Save después de hacer tus ediciones.
Preguntas frecuentes
¿Puedo eliminar una capa de un documento?
Sí — PsdImage.Layers tiene un setter funcional, así que puedes asignarle un array filtrado para eliminar capas (ver Paso 6).
¿Qué modos de fusión están disponibles?
BlendMode incluye valores como Normal, Multiply, Screen, Overlay y Darken, entre otros — configurado mediante Layer.BlendModeKey.
¿Está disponible la información de máscara de capa?
Layer.LayerMaskData tiene un getter funcional, pero su setter lanza NotSupportedException en esta compilación FOSS.