Il filtro Displace è uno degli strumenti di distorsione più utili di Photoshop. Deforma i pixel di un livello in base ai valori di luminosità di una mappa di spostamento separata, il che consente ai designer di avvolgere le grafiche attorno alle pieghe del tessuto, aggiungere effetti di increspatura o adattare i loghi a superfici testurizzate. Quando quel filtro viene applicato come filtro intelligente, le sue impostazioni risiedono all’interno del file PSD e rimangono completamente modificabili. Questo articolo mostra come leggere e scrivere i dati del filtro intelligente Displace in C#. Aggiungerai un filtro intelligente Displace a un livello Smart Object, configurerai le opzioni di scala e gestione dei bordi, incorporerai la mappa di spostamento, salverai il PSD e poi leggerai nuovamente le impostazioni del filtro per verificare il ciclo completo — il tutto senza avere Adobe Photoshop installato.

Punti chiave

  • La classe DisplaceSmartFilter, disponibile in Aspose.PSD for .NET 26.8 e successive, espone il filtro Displace di Photoshop come un oggetto .NET tipizzato.
  • La scala orizzontale e verticale, il metodo di spostamento (Tile o Stretch) e la gestione delle aree non definite (WrapAround o RepeatEdgePixels) sono tutte semplici proprietà di lettura/scrittura.
  • La mappa di spostamento può essere incorporata nel PSD di output passando true al costruttore, il che mantiene il file autonomo e portabile.
  • SmartFilters.UpdateResourceValues() deve essere chiamato dopo aver modificato la collezione di filtri, altrimenti le modifiche non vengono salvate.
  • La stessa API legge i dati del filtro dai file PSD esistenti, il che la rende adatta per la convalida, l’audit e l’elaborazione batch.

Perché il filtro intelligente Displace è importante

Le pipeline di automazione del design spesso devono riprodurre gli effetti di Photoshop su larga scala. Esempi tipici includono la generazione di mockup di prodotto in cui un design stampato segue le pieghe di una maglietta, la creazione di varianti di template per i team di marketing o la verifica di una libreria di template PSD per confermare che ogni file utilizzi le stesse impostazioni del filtro.

Fare questo manualmente in Photoshop non è scalabile e appiattire l’effetto in pixel fa perdere la possibilità di modificarlo in seguito. Leggendo e scrivendo i dati del filtro intelligente Displace in C#, mantieni il filtro non distruttivo e modificabile in Photoshop, controllandolo al contempo dal codice lato server, da processi in background o da strumenti desktop.

Utilizzo di Aspose.PSD per la lettura e la scrittura dei dati del filtro intelligente Displace

Aspose.PSD for .NET consente agli sviluppatori C# di leggere e scrivere i dati del filtro smart Displace direttamente tramite la classe DisplaceSmartFilter.

Iniziare

Installa il Aspose.PSD pacchetto NuGet (versione 26.8 o successiva) dalla Console di Gestione Pacchetti:

Install-Package Aspose.PSD

Oppure usa la .NET CLI:

dotnet add package AspAspose.PSD

Gli esempi seguenti utilizzano i seguenti namespace:

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;

Avrai inoltre bisogno di due file di input: un PSD che contenga almeno un livello Smart Object e un PSD da utilizzare come mappa di spostamento. Per i dettagli dell’API, consulta la documentazione di Aspose.PSD for .NET e la guida ai filtri intelligenti.

Proprietà di DisplaceSmartFilter a colpo d’occhio

PropertyTypePurpose
HorizontalScaledoubleScala di spostamento orizzontale, come nella finestra di dialogo Displace di Photoshop
VerticalScaledoubleScala di spostamento verticale
DisplacementMethodDisplacementMethodTile ripete la mappa; Stretch ridimensiona la mappa per adattarla al livello
UndefinedAreasUndefinedAreasWrapAround o RepeatEdgePixels per i pixel spostati al di fuori del livello
IsDisplacementMapEmbeddedboolIndica se la mappa è incorporata nel PSD
DisplaceMapData—I dati della mappa di spostamento incorporata
DisplacementMapPathstringIl percorso della mappa di spostamento

Come aggiungere un filtro intelligente Displace in C#

Il primo passo è caricare un PSD che contiene un livello Smart Object. Quindi crei un DisplaceSmartFilter, configuri le sue proprietà, lo aggiungi alla collezione di filtri smart del livello e salvi il risultato.

Il seguente esempio C# aggiunge e configura un filtro intelligente Displace su un livello Smart Object.

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

Spiegazione

  1. Caricamento del PSD – Image.Load restituisce un Image generico, che viene convertito in PsdImage per accedere alle funzionalità specifiche del PSD come livelli e filtri intelligenti.
  2. Ricerca del livello Smart Object – OfType<SmartObjectLayer>() seleziona il primo livello Smart Object e genera un messaggio chiaro se non esiste. Questo è più sicuro rispetto all’indicizzazione diretta di Layers, poiché l’ordine dei livelli varia tra i file.
  3. Creazione del filtro – Il costruttore DisplaceSmartFilter(string, bool) accetta il percorso della mappa di spostamento e un flag che controlla se la mappa è incorporata. Passare true rende il PSD di output autonomo.
  4. Configurazione del filtro – HorizontalScale e VerticalScale impostano l’intensità dello spostamento. DisplacementMethod.Tile ripete la mappa sul livello, mentre Stretch la ridimensiona per adattarla. UndefinedAreas.WrapAround riempie i pixel spostati fuori dalla tela con contenuto dal bordo opposto; RepeatEdgePixels estende i colori del bordo invece.
  5. Aggiornamento della collezione – SmartFilters.Filters è esposto come array. Copiarlo in una List<SmartFilter>, aggiungere il nuovo filtro e assegnare nuovamente ToArray() preserva eventuali filtri intelligenti già presenti sul livello.
  6. Persistenza delle modifiche – UpdateResourceValues() scrive la collezione di filtri nelle risorse PSD del livello. Omettere questa chiamata fa perdere il nuovo filtro al salvataggio.
  7. Salvataggio – image.Save(outputFile) scrive il PSD aggiornato su disco.

Come leggere i dati del filtro intelligente Displace in C#

Dopo aver salvato il PSD, è possibile ricaricarlo e ispezionare le proprietà del filtro per confermare che ogni valore sia stato salvato correttamente. Lo stesso approccio funziona per i file PSD creati in Photoshop.

Il seguente esempio C# legge il filtro intelligente Displace e ne valida le impostazioni.

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

Spiegazione

  1. Ricaricamento del file – Image.Load apre il PSD salvato nel passaggio precedente.
  2. Individuazione del livello Smart Object – La stessa ricerca basata sul tipo mantiene coerenti le fasi di lettura e scrittura.
  3. Ricerca del filtro per tipo – OfType<DisplaceSmartFilter>().LastOrDefault() restituisce il filtro Displace aggiunto più di recente e non produce mai un cast non valido. Questo è più affidabile rispetto alla lettura dell’ultimo elemento dell’array e al cast con as, che restituisce silenziosamente null se in quella posizione è presente un filtro diverso.
  4. Lettura delle proprietà – Tutte le impostazioni del filtro sono disponibili come proprietà tipizzate, quindi possono essere registrate, confrontate o esportate in un report.
  5. Validazione – L’helper AssertAreEqual confronta i valori persistiti con i valori originali e genera un’eccezione con un messaggio descrittivo in caso di discrepanza.

Conclusione

Con la classe DisplaceSmartFilter in Aspose.PSD for .NET, gli sviluppatori C# possono aggiungere, configurare, salvare e leggere nuovamente i filtri smart Displace di Photoshop interamente tramite codice. Il filtro rimane non distruttivo e modificabile in Photoshop, la mappa di spostamento può viaggiare all’interno del PSD, e la stessa API supporta la convalida round‑trip. Questo rende semplice costruire generatori di mockup, pipeline di template e strumenti di audit PSD basati su .NET.

FAQ

  1. Quale versione di Aspose.PSD for .NET supporta il filtro intelligente Displace? La lettura e la scrittura dei dati del filtro intelligente Displace è stata introdotta in Aspose.PSD for .NET 26.8. Usa la versione 26.8 o successiva per accedere alla classe DisplaceSmartFilter.

  2. Posso aggiungere un DisplaceSmartFilter a un livello raster normale? I dati del filtro intelligente sono memorizzati con i livelli Smart Object, quindi il filtro deve essere aggiunto alla raccolta SmartFilters di un SmartObjectLayer. Se il tuo contenuto è su un livello normale, converti prima in un Smart Object.

  3. Come incorporare la mappa di spostamento nel PSD? Passare il percorso della mappa di spostamento e true al costruttore DisplaceSmartFilter. Dopo il salvataggio, IsDisplacementMapEmbedded restituisce true e DisplaceMapData contiene i dati della mappa incorporata.

  4. Quali valori può assumere la proprietà UndefinedAreas? UndefinedAreas supporta WrapAround, che riempie i pixel non definiti con contenuti dal bordo opposto dell’immagine, e RepeatEdgePixels, che estende i colori dei pixel di bordo.

  5. Qual è la differenza tra DisplacementMethod.Tile e DisplacementMethod.Stretch? Tile ripete la mappa di spostamento attraverso lo strato nella sua dimensione originale, mentre Stretch ridimensiona la mappa per adattarla allo strato.

  6. Devo chiamare UpdateResourceValues dopo aver modificato i filtri intelligenti? Sì. UpdateResourceValues scrive la collezione di filtri modificata nelle risorse del livello Smart Object. Senza di esso, il nuovo filtro non viene salvato quando salvi.

Ottieni una licenza gratuita e scopri di più

Valuta Aspose.PSD for .NET senza limitazioni richiedendo una licenza temporanea:

Ottieni una licenza temporanea gratuita

Risorse aggiuntive per lavorare con i file PSD in .NET:

Leggi di più