El filtro Displace es una de las herramientas de distorsión más útiles de Photoshop. Deforma los píxeles de una capa según los valores de brillo de un mapa de desplazamiento separado, lo que permite a los diseñadores envolver ilustraciones alrededor de pliegues de tela, añadir efectos de ondulación o colocar logotipos sobre superficies texturizadas. Cuando ese filtro se aplica como filtro inteligente, sus configuraciones se guardan dentro del archivo PSD y siguen siendo completamente editables. Este artículo muestra cómo leer y escribir datos del filtro inteligente Displace en C#. Añadirás un filtro inteligente Displace a una capa de Smart Object, configurarás sus opciones de escala y manejo de bordes, incrustarás el mapa de desplazamiento, guardarás el PSD y luego leerás la configuración del filtro para verificar el proceso completo, todo sin necesidad de tener Adobe Photoshop instalado.
Puntos clave
- La clase
DisplaceSmartFilter, disponible en Aspose.PSD for .NET 26.8 y posteriores, expone el filtro Displace de Photoshop como un objeto .NET fuertemente tipado. - La escala horizontal y vertical, el método de desplazamiento (
TileoStretch) y el manejo de áreas indefinidas (WrapAroundoRepeatEdgePixels) son todas propiedades de lectura/escritura simples. - El mapa de desplazamiento puede incrustarse en el PSD de salida pasando
trueal constructor, lo que mantiene el archivo autónomo y portátil. - Debe llamarse a
SmartFilters.UpdateResourceValues()después de modificar la colección de filtros, de lo contrario los cambios no se guardarán. - La misma API lee los datos del filtro de archivos PSD existentes, lo que la hace adecuada para validación, auditoría y procesamiento por lotes.
Por qué el filtro inteligente Displace es importante
Los flujos de trabajo de automatización de diseño a menudo necesitan reproducir efectos de Photoshop a gran escala. Los ejemplos típicos incluyen generar maquetas de productos donde un diseño impreso sigue los pliegues de una camiseta, producir variaciones de plantillas para equipos de marketing, o auditar una biblioteca de plantillas PSD para confirmar que cada archivo utiliza la misma configuración de filtro.
Hacer esto manualmente en Photoshop no escala, y aplanar el efecto en píxeles pierde la capacidad de editarlo más tarde. Al leer y escribir datos del filtro inteligente Displace en C#, mantienes el filtro no destructivo y editable en Photoshop, mientras lo controlas desde código del lado del servidor, trabajos en segundo plano o herramientas de escritorio.
Uso de Aspose.PSD para leer y escribir datos del filtro inteligente Displace
Aspose.PSD for .NET permite a los desarrolladores C# leer y escribir datos del filtro inteligente Displace directamente a través de la clase DisplaceSmartFilter.
Primeros pasos
Instale el paquete NuGet Aspose.PSD (versión 26.8 o posterior) desde la consola del Administrador de paquetes:
Install-Package Aspose.PSD
O use la CLI de .NET:
dotnet add package Aspose.PSD
Los ejemplos a continuación utilizan los siguientes espacios de nombres:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers.SmartFilters;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;
También necesitará dos archivos de entrada: un PSD que contenga al menos una capa de Smart Object, y un PSD para usar como mapa de desplazamiento. Para obtener detalles de la API, consulte la documentación de Aspose.PSD for .NET y la guía de filtros inteligentes.
Propiedades de DisplaceSmartFilter de un vistazo
| Propiedad | Tipo | Propósito |
|---|---|---|
HorizontalScale | double | Escala de desplazamiento horizontal, como en el cuadro de diálogo Desplazar de Photoshop |
VerticalScale | double | Escala de desplazamiento vertical |
DisplacementMethod | DisplacementMethod | Tile repite el mapa; Stretch redimensiona el mapa para ajustarlo a la capa |
UndefinedAreas | UndefinedAreas | WrapAround o RepeatEdgePixels para píxeles desplazados fuera de la capa |
IsDisplacementMapEmbedded | bool | Indica si el mapa está incrustado en el PSD |
DisplaceMapData | — | Los datos del mapa de desplazamiento incrustado |
DisplacementMapPath | string | La ruta del mapa de desplazamiento |
Cómo agregar un filtro inteligente Displace en C#
El primer paso es cargar un PSD que contiene una capa de objeto inteligente. Luego crea un DisplaceSmartFilter, configura sus propiedades, lo agrega a la colección de filtros inteligentes de la capa y guarda el resultado.
El siguiente ejemplo en C# agrega y configura un filtro inteligente Displace en una capa de objeto inteligente.
string baseFolder = "Data";
string outputFolder = "Output";
Directory.CreateDirectory(outputFolder);
string sourceFile = Path.Combine(baseFolder, "no_displace_filter.psd");
string displaceMapPath = Path.Combine(baseFolder, "displace_map.psd");
string outputFile = Path.Combine(outputFolder, "output_displace_filter.psd");
// Load the source PSD file.
using (PsdImage image = (PsdImage)Image.Load(sourceFile))
{
// Find the first Smart Object layer instead of relying on a hard-coded index.
SmartObjectLayer smartObj = image.Layers.OfType<SmartObjectLayer>().FirstOrDefault()
?? throw new InvalidOperationException("The source PSD has no Smart Object layer.");
// Create the filter. The second argument embeds the displacement map in the output PSD.
DisplaceSmartFilter displace = new DisplaceSmartFilter(displaceMapPath, true)
{
HorizontalScale = 12.5,
VerticalScale = 15.0,
DisplacementMethod = DisplacementMethod.Tile,
UndefinedAreas = UndefinedAreas.WrapAround
};
// Filters is exposed as an array, so copy it to a list, append the new filter,
// and assign the updated array back to the collection.
List<SmartFilter> filters = new List<SmartFilter>(smartObj.SmartFilters.Filters);
filters.Add(displace);
smartObj.SmartFilters.Filters = filters.ToArray();
// Write the updated filter collection into the Smart Object layer's resources.
smartObj.SmartFilters.UpdateResourceValues();
// Save the modified PSD.
image.Save(outputFile);
}
Explicación
- Cargando el PSD –
Image.Loaddevuelve unaImagegenérica, que se convierte aPsdImagepara acceder a funciones específicas de PSD como capas y filtros inteligentes. - Encontrar la capa de Smart Object –
OfType<SmartObjectLayer>()selecciona la primera capa de Smart Object y falla con un mensaje claro si no existe ninguna. Esto es más seguro que indexar directamente enLayers, porque el orden de capas varía entre archivos. - Crear el filtro – El constructor
DisplaceSmartFilter(string, bool)recibe la ruta del mapa de desplazamiento y una bandera que controla si el mapa se incrusta. Pasartruehace que el PSD de salida sea autónomo. - Configurar el filtro –
HorizontalScaleyVerticalScaleestablecen la intensidad del desplazamiento.DisplacementMethod.Tilerepite el mapa a lo largo de la capa, mientras queStretchlo redimensiona para ajustarse.UndefinedAreas.WrapAroundrellena los píxeles desplazados fuera del lienzo con contenido del borde opuesto;RepeatEdgePixelsextiende los colores del borde en su lugar. - Actualizar la colección –
SmartFilters.Filtersse expone como una matriz. Copiarla a unaList<SmartFilter>, agregar el nuevo filtro y asignar de nuevoToArray()preserva cualquier filtro inteligente que ya estuviera en la capa. - Persistir los cambios –
UpdateResourceValues()escribe la colección de filtros en los recursos PSD de la capa. Omitir esta llamada hace que el nuevo filtro se pierda al guardar. - Guardar –
image.Save(outputFile)escribe el PSD actualizado en el disco.
Cómo leer los datos del filtro inteligente Displace en C#
Después de guardar el PSD, puedes volver a cargarlo e inspeccionar las propiedades del filtro para confirmar que cada valor se haya guardado correctamente. El mismo enfoque funciona para archivos PSD creados en Photoshop.
El siguiente ejemplo en C# lee el filtro inteligente Displace y valida sus configuraciones.
using (PsdImage image = (PsdImage)Image.Load(outputFile))
{
SmartObjectLayer smartObj = image.Layers.OfType<SmartObjectLayer>().FirstOrDefault()
?? throw new InvalidOperationException("The PSD has no Smart Object layer.");
// Search by type instead of position, so other smart filters on the layer are ignored.
DisplaceSmartFilter displace = smartObj.SmartFilters.Filters
.OfType<DisplaceSmartFilter>()
.LastOrDefault()
?? throw new InvalidOperationException("No Displace smart filter found on the layer.");
Console.WriteLine($"Horizontal scale: {displace.HorizontalScale}");
Console.WriteLine($"Vertical scale: {displace.VerticalScale}");
Console.WriteLine($"Method: {displace.DisplacementMethod}");
Console.WriteLine($"Undefined areas: {displace.UndefinedAreas}");
Console.WriteLine($"Map embedded: {displace.IsDisplacementMapEmbedded}");
// Verify that the saved values match the values written earlier.
AssertAreEqual(12.5, displace.HorizontalScale);
AssertAreEqual(15.0, displace.VerticalScale);
AssertAreEqual(DisplacementMethod.Tile, displace.DisplacementMethod);
AssertAreEqual(UndefinedAreas.WrapAround, displace.UndefinedAreas);
AssertAreEqual(true, displace.IsDisplacementMapEmbedded);
AssertAreEqual(true, displace.DisplaceMapData != null);
}
static void AssertAreEqual(object expected, object actual, string message = null)
{
if (!object.Equals(expected, actual))
{
throw new Exception(message ?? $"Expected {expected}, but got {actual}.");
}
}
Explicación
- Recargando el archivo –
Image.Loadabre el PSD guardado en el paso anterior. - Localizando la capa de Smart Object – La misma búsqueda basada en tipos mantiene consistentes los pasos de lectura y escritura.
- Encontrando el filtro por tipo –
OfType<DisplaceSmartFilter>().LastOrDefault()devuelve el filtro Displace añadido más recientemente y nunca produce una conversión inválida. Esto es más fiable que leer el último elemento del arreglo y convertirlo conas, lo que devuelve silenciosamentenullsi en esa posición se encuentra un filtro diferente. - Leyendo propiedades – Todas las configuraciones del filtro están disponibles como propiedades tipadas, por lo que pueden registrarse, compararse o exportarse a un informe.
- Validación – El asistente
AssertAreEqualcompara los valores persistidos con los valores originales y lanza una excepción con un mensaje descriptivo ante cualquier discrepancia.
Conclusión
Con la clase DisplaceSmartFilter en Aspose.PSD for .NET, los desarrolladores C# pueden agregar, configurar, guardar y volver a leer los filtros inteligentes Displace de Photoshop completamente en código. El filtro permanece no destructivo y editable en Photoshop, el mapa de desplazamiento puede viajar dentro del PSD, y la misma API admite la validación de ida y vuelta. Esto facilita la creación de generadores de maquetas, pipelines de plantillas y herramientas de auditoría de PSD sobre .NET.
Preguntas frecuentes
¿Qué versión de Aspose.PSD for .NET soporta el filtro inteligente Displace? La lectura y escritura de datos del filtro inteligente Displace se introdujo en Aspose.PSD for .NET 26.8. Use la versión 26.8 o posterior para acceder a la clase
DisplaceSmartFilter.¿Puedo agregar un DisplaceSmartFilter a una capa raster regular? Los datos del filtro inteligente se almacenan con capas de Smart Object, por lo que el filtro debe agregarse a la colección
SmartFiltersde unSmartObjectLayer. Si tu contenido está en una capa regular, conviértelo primero a un Smart Object.¿Cómo incrusto el mapa de desplazamiento en el PSD? Pase la ruta del mapa de desplazamiento y
trueal constructorDisplaceSmartFilter. Después de guardar,IsDisplacementMapEmbeddeddevuelvetrueyDisplaceMapDatacontiene los datos del mapa incrustado.¿Qué valores puede tomar la propiedad UndefinedAreas?
UndefinedAreassoportaWrapAround, que rellena los píxeles indefinidos con contenido del borde opuesto de la imagen, yRepeatEdgePixels, que extiende los colores de los píxeles del borde.¿Cuál es la diferencia entre DisplacementMethod.Tile y DisplacementMethod.Stretch?
Tilerepite el mapa de desplazamiento a través de la capa en su tamaño original, mientras queStretchredimensiona el mapa para ajustarse a la capa.¿Tengo que llamar a UpdateResourceValues después de modificar filtros inteligentes?
Sí.UpdateResourceValuesescribe la colección de filtros modificada en los recursos de la capa Smart Object. Sin ello, el nuevo filtro no se conserva al guardar.
Obtén una licencia gratuita y explora más
Evalúa Aspose.PSD for .NET sin limitaciones solicitando una licencia temporal:
Obtén una licencia temporal gratuita
Recursos adicionales para trabajar con archivos PSD en .NET:
- Documentación de Aspose.PSD for .NET
- Referencia de API de Aspose.PSD for .NET
- Manipulación de filtros inteligentes en Aspose.PSD for C#
- Herramientas PSD en línea gratuitas
