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 (
TileoStretch) e la gestione delle aree non definite (WrapAroundoRepeatEdgePixels) sono tutte semplici proprietà di lettura/scrittura. - La mappa di spostamento può essere incorporata nel PSD di output passando
trueal 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
| Property | Type | Purpose |
|---|---|---|
HorizontalScale | double | Scala di spostamento orizzontale, come nella finestra di dialogo Displace di Photoshop |
VerticalScale | double | Scala di spostamento verticale |
DisplacementMethod | DisplacementMethod | Tile ripete la mappa; Stretch ridimensiona la mappa per adattarla al livello |
UndefinedAreas | UndefinedAreas | WrapAround o RepeatEdgePixels per i pixel spostati al di fuori del livello |
IsDisplacementMapEmbedded | bool | Indica se la mappa è incorporata nel PSD |
DisplaceMapData | — | I dati della mappa di spostamento incorporata |
DisplacementMapPath | string | Il 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
- Caricamento del PSD –
Image.Loadrestituisce unImagegenerico, che viene convertito inPsdImageper accedere alle funzionalità specifiche del PSD come livelli e filtri intelligenti. - 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 diLayers, poiché l’ordine dei livelli varia tra i file. - Creazione del filtro – Il costruttore
DisplaceSmartFilter(string, bool)accetta il percorso della mappa di spostamento e un flag che controlla se la mappa è incorporata. Passaretruerende il PSD di output autonomo. - Configurazione del filtro –
HorizontalScaleeVerticalScaleimpostano l’intensità dello spostamento.DisplacementMethod.Tileripete la mappa sul livello, mentreStretchla ridimensiona per adattarla.UndefinedAreas.WrapAroundriempie i pixel spostati fuori dalla tela con contenuto dal bordo opposto;RepeatEdgePixelsestende i colori del bordo invece. - Aggiornamento della collezione –
SmartFilters.Filtersè esposto come array. Copiarlo in unaList<SmartFilter>, aggiungere il nuovo filtro e assegnare nuovamenteToArray()preserva eventuali filtri intelligenti già presenti sul livello. - Persistenza delle modifiche –
UpdateResourceValues()scrive la collezione di filtri nelle risorse PSD del livello. Omettere questa chiamata fa perdere il nuovo filtro al salvataggio. - 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
- Ricaricamento del file –
Image.Loadapre il PSD salvato nel passaggio precedente. - Individuazione del livello Smart Object – La stessa ricerca basata sul tipo mantiene coerenti le fasi di lettura e scrittura.
- 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 conas, che restituisce silenziosamentenullse in quella posizione è presente un filtro diverso. - Lettura delle proprietà – Tutte le impostazioni del filtro sono disponibili come proprietà tipizzate, quindi possono essere registrate, confrontate o esportate in un report.
- Validazione – L’helper
AssertAreEqualconfronta 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
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.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
SmartFiltersdi unSmartObjectLayer. Se il tuo contenuto è su un livello normale, converti prima in un Smart Object.Come incorporare la mappa di spostamento nel PSD? Passare il percorso della mappa di spostamento e
trueal costruttoreDisplaceSmartFilter. Dopo il salvataggio,IsDisplacementMapEmbeddedrestituiscetrueeDisplaceMapDatacontiene i dati della mappa incorporata.Quali valori può assumere la proprietà UndefinedAreas?
UndefinedAreassupportaWrapAround, che riempie i pixel non definiti con contenuti dal bordo opposto dell’immagine, eRepeatEdgePixels, che estende i colori dei pixel di bordo.Qual è la differenza tra DisplacementMethod.Tile e DisplacementMethod.Stretch?
Tileripete la mappa di spostamento attraverso lo strato nella sua dimensione originale, mentreStretchridimensiona la mappa per adattarla allo strato.Devo chiamare UpdateResourceValues dopo aver modificato i filtri intelligenti? Sì.
UpdateResourceValuesscrive 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:
- Documentazione di Aspose.PSD per .NET
- Riferimento API di Aspose.PSD per .NET
- Manipolazione dei filtri intelligenti in Aspose.PSD per C#
- Strumenti PSD online gratuiti
