O filtro Displace é uma das ferramentas de distorção mais úteis do Photoshop. Ele deforma os pixels de uma camada de acordo com os valores de brilho de um mapa de deslocamento separado, que é como os designers envolvem arte em dobras de tecido, adicionam efeitos de ondulação ou ajustam logotipos em superfícies texturizadas. Quando esse filtro é aplicado como um filtro inteligente, suas configurações ficam dentro do arquivo PSD e permanecem totalmente editáveis. Este artigo mostra como ler e gravar dados do filtro inteligente Displace em C#. Você adicionará um filtro inteligente Displace a uma camada de Objeto Inteligente, configurará suas opções de escala e tratamento de bordas, incorporará o mapa de deslocamento, salvará o PSD e, em seguida, lerá as configurações do filtro para verificar a ida e volta — tudo sem o Adobe Photoshop instalado.

Principais Conclusões

  • A classe DisplaceSmartFilter, disponível no Aspose.PSD for .NET 26.8 e posteriores, expõe o filtro Displace do Photoshop como um objeto .NET tipado fortemente.
  • A escala horizontal e vertical, o método de deslocamento (Tile ou Stretch) e o tratamento de áreas indefinidas (WrapAround ou RepeatEdgePixels) são todas propriedades simples de leitura/gravação.
  • O mapa de deslocamento pode ser incorporado ao PSD de saída passando true ao construtor, o que mantém o arquivo autônomo e portátil.
  • SmartFilters.UpdateResourceValues() deve ser chamado após alterar a coleção de filtros, caso contrário as alterações não serão salvas.
  • A mesma API lê os dados do filtro de volta a partir de arquivos PSD existentes, o que a torna adequada para validação, auditoria e processamento em lote.

Por que o Filtro Inteligente Displace Importa

Os pipelines de automação de design frequentemente precisam reproduzir efeitos do Photoshop em escala. Exemplos típicos incluem gerar mockups de produtos onde um design impresso segue as dobras de uma camiseta, produzir variações de modelos para equipes de marketing ou auditar uma biblioteca de modelos PSD para confirmar que cada arquivo usa as mesmas configurações do filtro.

Fazer isso manualmente no Photoshop não escala, e achatar o efeito em pixels faz com que se perca a capacidade de editá‑lo posteriormente. Ao ler e gravar os dados do filtro inteligente Displace em C#, você mantém o filtro não destrutivo e editável no Photoshop, enquanto o controla a partir de código do lado do servidor, trabalhos em segundo plano ou ferramentas de desktop.

Usando Aspose.PSD para leitura e gravação de dados de filtro inteligente Displace

Aspose.PSD for .NET permite que desenvolvedores C# leiam e escrevam dados do filtro inteligente Displace diretamente através da classe DisplaceSmartFilter.

Introdução

Instale o Aspose.PSD NuGet package (versão 26.8 ou posterior) a partir do Console do Gerenciador de Pacotes:

Install-Package Aspose.PSD

Ou use a CLI do .NET:

dotnet add package Aspose.PSD

Os exemplos abaixo utilizam os seguintes namespaces:

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;

Você também precisará de dois arquivos de entrada: um PSD que contenha pelo menos uma camada de Smart Object e um PSD para usar como mapa de deslocamento. Para detalhes da API, veja a Aspose.PSD for .NET documentation e o guia de filtros inteligentes.

Propriedades do DisplaceSmartFilter em um Relance

PropertyTypePurpose
HorizontalScaledoubleEscala de deslocamento horizontal, como na caixa de diálogo Displace do Photoshop
VerticalScaledoubleEscala de deslocamento vertical
DisplacementMethodDisplacementMethodTile repete o mapa; Stretch redimensiona o mapa para caber na camada
UndefinedAreasUndefinedAreasWrapAround ou RepeatEdgePixels para pixels deslocados fora da camada
IsDisplacementMapEmbeddedboolIndica se o mapa está incorporado no PSD
DisplaceMapData—Os dados do mapa de deslocamento incorporado
DisplacementMapPathstringO caminho do mapa de deslocamento

Como Adicionar um Filtro Inteligente Displace em C#

O primeiro passo é carregar um PSD que contém uma camada de Objeto Inteligente. Em seguida, você cria um DisplaceSmartFilter, configura suas propriedades, adiciona‑o à coleção de filtros inteligentes da camada e salva o resultado.

O exemplo C# a seguir adiciona e configura um filtro inteligente Displace em uma camada 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);
}

Explicação

  1. Carregando o PSD – Image.Load retorna um Image genérico, que é convertido para PsdImage para acessar recursos específicos do PSD, como camadas e filtros inteligentes.
  2. Encontrando a camada de Smart Object – OfType<SmartObjectLayer>() seleciona a primeira camada de Smart Object e falha com uma mensagem clara se nenhuma existir. Isso é mais seguro do que indexar diretamente em Layers, pois a ordem das camadas varia entre arquivos.
  3. Criando o filtro – O construtor DisplaceSmartFilter(string, bool) recebe o caminho do mapa de deslocamento e uma bandeira que controla se o mapa é incorporado. Passar true torna o PSD de saída autônomo.
  4. Configurando o filtro – HorizontalScale e VerticalScale definem a intensidade do deslocamento. DisplacementMethod.Tile repete o mapa ao longo da camada, enquanto Stretch redimensiona para caber. UndefinedAreas.WrapAround preenche os pixels deslocados fora da tela com conteúdo da borda oposta; RepeatEdgePixels estende as cores da borda.
  5. Atualizando a coleção – SmartFilters.Filters é exposto como um array. Copiá-lo para um List<SmartFilter>, adicionar o novo filtro e atribuir ToArray() de volta preserva quaisquer filtros inteligentes que já estavam na camada.
  6. Persistindo as alterações – UpdateResourceValues() grava a coleção de filtros nos recursos PSD da camada. Pular esta chamada faz com que o novo filtro seja perdido ao salvar.
  7. Salvando – image.Save(outputFile) grava o PSD atualizado no disco.

Como Ler Dados do Filtro Inteligente Displace em C#

Depois de salvar o PSD, você pode recarregá‑lo e inspecionar as propriedades do filtro para confirmar que cada valor foi persistido corretamente. A mesma abordagem funciona para arquivos PSD criados no Photoshop.

O exemplo C# a seguir lê o filtro inteligente Displace e valida suas configurações.

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}.");
    }
}

Explicação

  1. Recarregando o arquivo – Image.Load abre o PSD salvo na etapa anterior.
  2. Localizando a camada Smart Object – A mesma pesquisa baseada em tipo mantém as etapas de leitura e gravação consistentes.
  3. Encontrando o filtro por tipo – OfType<DisplaceSmartFilter>().LastOrDefault() retorna o filtro Displace adicionado mais recentemente e nunca produz um cast inválido. Isso é mais confiável do que ler o último elemento do array e fazer cast com as, que silenciosamente retorna null se um filtro diferente estiver nessa posição.
  4. Lendo propriedades – Todas as configurações do filtro estão disponíveis como propriedades tipadas, podendo ser registradas, comparadas ou exportadas para um relatório.
  5. Validação – O helper AssertAreEqual compara os valores persistidos com os valores originais e lança uma exceção com uma mensagem descritiva em caso de divergência.

Conclusão

Com a classe DisplaceSmartFilter no Aspose.PSD for .NET, desenvolvedores C# podem adicionar, configurar, salvar e ler novamente filtros inteligentes Displace do Photoshop inteiramente em código. O filtro permanece não destrutivo e editável no Photoshop, o mapa de deslocamento pode viajar dentro do PSD, e a mesma API suporta validação de ida e volta. Isso torna simples a construção de geradores de mockup, pipelines de modelo e ferramentas de auditoria de PSD sobre .NET.

FAQs

  1. Qual versão do Aspose.PSD for .NET suporta o filtro inteligente Displace? A leitura e gravação de dados do filtro inteligente Displace foi introduzida no Aspose.PSD for .NET 26.8. Use a versão 26.8 ou posterior para acessar a classe DisplaceSmartFilter.

  2. Posso adicionar um DisplaceSmartFilter a uma camada raster regular? Os dados do filtro inteligente são armazenados com camadas de Smart Object, portanto o filtro deve ser adicionado à coleção SmartFilters de um SmartObjectLayer. Se o seu conteúdo estiver em uma camada regular, converta‑o primeiro para um Smart Object.

  3. Como faço para incorporar o mapa de deslocamento no PSD? Passe o caminho do mapa de deslocamento e true para o construtor DisplaceSmartFilter. Após salvar, IsDisplacementMapEmbedded retorna true e DisplaceMapData contém os dados do mapa incorporado.

  4. Quais valores a propriedade UndefinedAreas pode receber? UndefinedAreas suporta WrapAround, que preenche os pixels indefinidos com conteúdo da borda oposta da imagem, e RepeatEdgePixels, que estende as cores dos pixels da borda.

  5. Qual é a diferença entre DisplacementMethod.Tile e DisplacementMethod.Stretch? Tile repete o mapa de deslocamento através da camada em seu tamanho original, enquanto Stretch redimensiona o mapa para caber na camada.

  6. Preciso chamar UpdateResourceValues após modificar filtros inteligentes? Sim. UpdateResourceValues grava a coleção de filtros modificada nos recursos da camada do Smart Object. Sem isso, o novo filtro não é persistido ao salvar.

Obtenha uma Licença Gratuita e Explore Mais

Avalie o Aspose.PSD for .NET sem limitações solicitando uma licença temporária:

Obtenha uma Licença Temporária Gratuita

Recursos adicionais para trabalhar com arquivos PSD em .NET:

Leia Mais