Le filtre Displace est l’un des outils de distorsion les plus utiles de Photoshop. Il déforme les pixels d’un calque en fonction des valeurs de luminosité d’une carte de déplacement séparée, ce qui permet aux concepteurs d’envelopper des illustrations autour des plis du tissu, d’ajouter des effets d’ondulation ou d’adapter des logos sur des surfaces texturées. Lorsqu’il est appliqué en tant que filtre dynamique, ses paramètres sont enregistrés dans le fichier PSD et restent entièrement modifiables. Cet article montre comment lire et écrire les données du filtre dynamique Displace en C#. Vous ajouterez un filtre dynamique Displace à un calque d’objet dynamique, configurerez ses options d’échelle et de gestion des bords, intégrerez la carte de déplacement, enregistrerez le PSD, puis lirez à nouveau les paramètres du filtre pour vérifier le cycle complet — le tout sans Adobe Photoshop installé.

Points clés

  • La classe DisplaceSmartFilter, disponible dans Aspose.PSD for .NET 26.8 et versions ultérieures, expose le filtre Displace de Photoshop sous forme d’un objet .NET fortement typé.
  • L’échelle horizontale et verticale, la méthode de déplacement (Tile ou Stretch) et la gestion des zones indéfinies (WrapAround ou RepeatEdgePixels) sont toutes de simples propriétés en lecture/écriture.
  • La carte de déplacement peut être intégrée dans le PSD de sortie en passant true au constructeur, ce qui rend le fichier autonome et portable.
  • SmartFilters.UpdateResourceValues() doit être appelé après avoir modifié la collection de filtres, sinon les modifications ne sont pas enregistrées.
  • La même API lit les données de filtre à partir des fichiers PSD existants, ce qui la rend adaptée à la validation, à l’audit et au traitement par lots.

Pourquoi le filtre intelligent Displace est important

Les pipelines d’automatisation de la conception doivent souvent reproduire les effets Photoshop à grande échelle. Des exemples typiques incluent la génération de maquettes de produits où un design imprimé suit les plis d’un T‑shirt, la création de variantes de modèles pour les équipes marketing, ou l’audit d’une bibliothèque de modèles PSD afin de confirmer que chaque fichier utilise les mêmes paramètres de filtre.

Faire cela manuellement dans Photoshop n’est pas évolutif, et aplatir l’effet en pixels fait perdre la possibilité de le modifier ultérieurement. En lisant et en écrivant les données du filtre intelligent Displace en C#, vous conservez le filtre non destructif et modifiable dans Photoshop, tout en le contrôlant depuis le code côté serveur, les tâches en arrière‑plan ou les outils de bureau.

Utilisation d’Aspose.PSD pour la lecture et l’écriture des données du filtre intelligent Displace

Aspose.PSD for .NET permet aux développeurs C# de lire et d’écrire les données du filtre intelligent Displace directement via la classe DisplaceSmartFilter.

Démarrage

Installez le Aspose.PSD NuGet package (version 26.8 ou ultérieure) depuis la console du Gestionnaire de packages :

Install-Package Aspose.PSD

Ou utilisez la CLI .NET:

dotnet add package Aspose.PSD

Les exemples ci‑dessous utilisent les espaces de noms suivants :

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;

Vous aurez également besoin de deux fichiers d’entrée : un PSD contenant au moins un calque d’objet dynamique, et un PSD à utiliser comme carte de déplacement. Pour les détails de l’API, consultez la documentation Aspose.PSD for .NET et le guide des filtres intelligents.

Propriétés DisplaceSmartFilter en un coup d’œil

PropriétéTypeBut
HorizontalScaledoubleÉchelle de déplacement horizontal, comme dans la boîte de dialogue Displace de Photoshop
VerticalScaledoubleÉchelle de déplacement vertical
DisplacementMethodDisplacementMethodTile répète la carte ; Stretch redimensionne la carte pour l’adapter au calque
UndefinedAreasUndefinedAreasWrapAround ou RepeatEdgePixels pour les pixels déplacés en dehors du calque
IsDisplacementMapEmbeddedboolIndique si la carte est intégrée dans le PSD
DisplaceMapData—Les données de la carte de déplacement intégrée
DisplacementMapPathstringLe chemin de la carte de déplacement

Comment ajouter un filtre intelligent Displace en C#

La première étape consiste à charger un PSD contenant un calque d’objet dynamique. Vous créez ensuite un DisplaceSmartFilter, configurez ses propriétés, l’ajoutez à la collection de filtres intelligents du calque, puis enregistrez le résultat.

L’exemple C# suivant ajoute et configure un filtre intelligent Displace sur un calque d’objet dynamique.

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

Explication

  1. Chargement du PSD – Image.Load renvoie une Image générique, qui est convertie en PsdImage pour accéder aux fonctionnalités spécifiques aux PSD telles que les calques et les filtres intelligents.
  2. Recherche du calque Smart Object – OfType<SmartObjectLayer>() sélectionne le premier calque Smart Object et échoue avec un message clair s’il n’existe pas. C’est plus sûr que d’indexer directement dans Layers, car l’ordre des calques varie d’un fichier à l’autre.
  3. Création du filtre – Le constructeur DisplaceSmartFilter(string, bool) prend le chemin du fichier de carte de déplacement et un indicateur qui contrôle si la carte est intégrée. Passer true rend le PSD de sortie autonome.
  4. Configuration du filtre – HorizontalScale et VerticalScale définissent l’intensité du déplacement. DisplacementMethod.Tile répète la carte sur le calque, tandis que Stretch la redimensionne pour l’adapter. UndefinedAreas.WrapAround remplit les pixels déplacés hors du canevas avec le contenu du bord opposé ; RepeatEdgePixels étend les couleurs du bord à la place.
  5. Mise à jour de la collection – SmartFilters.Filters est exposé sous forme de tableau. Le copier dans une List<SmartFilter>, ajouter le nouveau filtre, puis réassigner le résultat de ToArray() préserve tous les filtres intelligents déjà présents sur le calque.
  6. Persistance des modifications – UpdateResourceValues() écrit la collection de filtres dans les ressources PSD du calque. Ignorer cet appel entraîne la perte du nouveau filtre lors de l’enregistrement.
  7. Enregistrement – image.Save(outputFile) écrit le PSD mis à jour sur le disque.

Comment lire les données du filtre Displace Smart Filter en C#

Après avoir enregistré le PSD, vous pouvez le recharger et inspecter les propriétés du filtre pour confirmer que chaque valeur a été correctement persistée. La même approche fonctionne pour les fichiers PSD créés dans Photoshop.

L’exemple C# suivant lit le filtre intelligent Displace et valide ses paramètres.

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

Explication

  1. Rechargement du fichier – Image.Load ouvre le PSD enregistré à l’étape précédente.
  2. Localisation du calque Smart Object – La même recherche basée sur le type maintient la cohérence des étapes de lecture et d’écriture.
  3. Recherche du filtre par type – OfType<DisplaceSmartFilter>().LastOrDefault() renvoie le filtre Displace ajouté le plus récemment et ne produit jamais de conversion invalide. C’est plus fiable que de lire le dernier élément du tableau et de le convertir avec as, ce qui renvoie silencieusement null si un autre filtre occupe cette position.
  4. Lecture des propriétés – Tous les paramètres du filtre sont disponibles en tant que propriétés typées, de sorte qu’ils puissent être journalisés, comparés ou exportés vers un rapport.
  5. Validation – L’assistant AssertAreEqual compare les valeurs persistées avec les valeurs d’origine et lève une exception avec un message descriptif en cas de divergence.

Conclusion

Avec la classe DisplaceSmartFilter dans Aspose.PSD for .NET, les développeurs C# peuvent ajouter, configurer, enregistrer et relire les filtres intelligents Displace de Photoshop entièrement en code. Le filtre reste non destructif et modifiable dans Photoshop, la carte de déplacement peut voyager à l’intérieur du PSD, et la même API prend en charge la validation round‑trip. Cela rend simple la création de générateurs de maquettes, de pipelines de modèles et d’outils d’audit PSD sur .NET.

FAQ

  1. Quelle version d’Aspose.PSD for .NET prend en charge le filtre intelligent Displace ?
    La lecture et l’écriture des données du filtre intelligent Displace ont été introduites dans Aspose.PSD for .NET 26.8. Utilisez la version 26.8 ou ultérieure pour accéder à la classe DisplaceSmartFilter.

  2. Puis-je ajouter un DisplaceSmartFilter à un calque raster ordinaire ? Les données du filtre intelligent sont stockées avec les calques d’objets intelligents, donc le filtre doit être ajouté à la collection SmartFilters d’un SmartObjectLayer. Si votre contenu se trouve sur un calque ordinaire, convertissez‑le d’abord en objet intelligent.

  3. Comment intégrer la carte de déplacement dans le PSD ? Passez le chemin de la carte de déplacement et true au constructeur DisplaceSmartFilter. Après l’enregistrement, IsDisplacementMapEmbedded renvoie true et DisplaceMapData contient les données de la carte intégrée.

  4. Quelles valeurs la propriété UndefinedAreas peut‑elle prendre ? UndefinedAreas prend en charge WrapAround, qui remplit les pixels non définis avec le contenu du bord opposé de l’image, et RepeatEdgePixels, qui prolonge les couleurs des pixels de bord.

  5. Quelle est la différence entre DisplacementMethod.Tile et DisplacementMethod.Stretch ?
    Tile répète la carte de déplacement sur le calque à sa taille d’origine, tandis que Stretch redimensionne la carte pour l’adapter au calque.

  6. Dois-je appeler UpdateResourceValues après avoir modifié les filtres intelligents ? Oui. UpdateResourceValues écrit la collection de filtres modifiée dans les ressources du calque Smart Object. Sans cela, le nouveau filtre n’est pas conservé lors de l’enregistrement.

Obtenez une licence gratuite et explorez davantage

Évaluez Aspose.PSD for .NET sans limitations en demandant une licence temporaire :

Obtenez une licence temporaire gratuite

Ressources supplémentaires pour travailler avec les fichiers PSD dans .NET :

En savoir plus