Der Displace‑Filter ist eines der nützlichsten Verzerrungswerkzeuge von Photoshop. Er verformt die Pixel einer Ebene basierend auf den Helligkeitswerten einer separaten Displacements‑Map, wodurch Designer Kunstwerke um Stofffalten wickeln, Welleneffekte hinzufügen oder Logos auf strukturierten Oberflächen platzieren können. Wird dieser Filter als Smart Filter angewendet, befinden sich seine Einstellungen innerhalb der PSD‑Datei und bleiben vollständig editierbar. Dieser Artikel zeigt, wie man Displace‑Smart‑Filter‑Daten in C# liest und schreibt. Sie fügen einer Smart‑Object‑Ebene einen Displace‑Smart‑Filter hinzu, konfigurieren seine Skalierungs‑ und Randbehandlungsoptionen, betten die Displacements‑Map ein, speichern die PSD und lesen anschließend die Filtereinstellungen aus, um den Rundlauf zu überprüfen – alles ohne installierte Adobe Photoshop.

Wichtige Erkenntnisse

  • Die Klasse DisplaceSmartFilter, verfügbar in Aspose.PSD for .NET 26.8 und später, stellt den Photoshop Displace‑Filter als stark typisiertes .NET‑Objekt bereit.
  • Horizontale und vertikale Skalierung, Verschiebungsmethode (Tile oder Stretch) und die Behandlung von undefinierten Bereichen (WrapAround oder RepeatEdgePixels) sind einfache Lese‑/Schreib‑Eigenschaften.
  • Die Verschiebungskarte kann in das Ausgab‑PSD eingebettet werden, indem true an den Konstruktor übergeben wird, wodurch die Datei eigenständig und portabel bleibt.
  • SmartFilters.UpdateResourceValues() muss nach dem Ändern der Filter‑Sammlung aufgerufen werden, sonst werden die Änderungen nicht gespeichert.
  • dieselbe API liest Filterdaten aus bestehenden PSD‑Dateien zurück, was sie für Validierung, Audits und Batch‑Verarbeitung geeignet macht.

Warum der Displace Smart Filter wichtig ist

Design‑Automatisierungspipelines müssen häufig Photoshop‑Effekte in großem Umfang reproduzieren. Typische Beispiele sind das Erstellen von Produkt‑Mockups, bei denen ein Druckdesign den Falten eines T‑Shirts folgt, das Erzeugen von Vorlagenvarianten für Marketing‑Teams oder das Prüfen einer Bibliothek von PSD‑Vorlagen, um sicherzustellen, dass jede Datei dieselben Filtereinstellungen verwendet.

Dies manuell in Photoshop zu erledigen ist nicht skalierbar, und das Zusammenführen des Effekts in Pixel führt dazu, dass die Möglichkeit, ihn später zu bearbeiten, verloren geht. Durch das Lesen und Schreiben von Displace‑Smart‑Filter‑Daten in C# behalten Sie den Filter nicht‑destruktiv und editierbar in Photoshop, während Sie ihn von serverseitigem Code, Hintergrundjobs oder Desktop‑Tools aus steuern.

Verwendung von Aspose.PSD zum Lesen und Schreiben von Displace Smart Filter-Daten

Aspose.PSD for .NET ermöglicht C#‑Entwicklern, Displace‑Smartfilter‑Daten direkt über die DisplaceSmartFilter‑Klasse zu lesen und zu schreiben.

Erste Schritte

Installieren Sie das Aspose.PSD NuGet-Paket (Version 26.8 oder höher) über die Package Manager Console:

Install-Package Aspose.PSD

Oder verwenden Sie die .NET CLI:

dotnet add package Aspose.PSD

Die nachstehenden Beispiele verwenden die folgenden 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;

Sie benötigen außerdem zwei Eingabedateien: ein PSD, das mindestens eine Smart‑Object‑Ebene enthält, und ein PSD, das als Displacements‑Karte verwendet wird. Für API‑Details siehe die Aspose.PSD for .NET Dokumentation und den Smart‑Filter‑Leitfaden.

DisplaceSmartFilter Eigenschaften auf einen Blick

EigenschaftTypZweck
HorizontalScaledoubleHorizontale Verschiebungsskala, wie im Displace-Dialog von Photoshop
VerticalScaledoubleVertikale Verschiebungsskala
DisplacementMethodDisplacementMethodTile wiederholt die Karte; Stretch ändert die Größe der Karte, um sie an die Ebene anzupassen
UndefinedAreasUndefinedAreasWrapAround oder RepeatEdgePixels für Pixel, die außerhalb der Ebene verschoben wurden
IsDisplacementMapEmbeddedboolGibt an, ob die Karte im PSD eingebettet ist
DisplaceMapData—Die eingebetteten Displacementskartendaten
DisplacementMapPathstringDer Pfad der Displacementskarte

So fügen Sie einen Displace Smart Filter in C# hinzu

Der erste Schritt besteht darin, ein PSD zu laden, das eine Smart Object‑Ebene enthält. Anschließend erstellen Sie einen DisplaceSmartFilter, konfigurieren dessen Eigenschaften, fügen ihn der Smart‑Filter‑Sammlung der Ebene hinzu und speichern das Ergebnis.

Das folgende C#-Beispiel fügt einen Displace‑Smartfilter zu einer Smart‑Object‑Ebene hinzu und konfiguriert ihn.

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

Erklärung

  1. Laden der PSD – Image.Load gibt ein generisches Image zurück, das zu PsdImage umgewandelt wird, um PSD‑spezifische Funktionen wie Ebenen und Smart‑Filter zu nutzen.
  2. Finden der Smart‑Object‑Ebene – OfType<SmartObjectLayer>() wählt die erste Smart‑Object‑Ebene aus und gibt eine klare Fehlermeldung aus, wenn keine vorhanden ist. Das ist sicherer als ein direktes Indexieren von Layers, da die Ebenenreihenfolge zwischen Dateien variieren kann.
  3. Erstellen des Filters – Der Konstruktor DisplaceSmartFilter(string, bool) nimmt den Pfad zur Displacements‑Karte und ein Flag, das steuert, ob die Karte eingebettet wird. Das Übergeben von true macht das resultierende PSD eigenständig.
  4. Konfigurieren des Filters – HorizontalScale und VerticalScale legen die Stärke der Verschiebung fest. DisplacementMethod.Tile wiederholt die Karte über die Ebene, während Stretch sie anpasst, um zu passen. UndefinedAreas.WrapAround füllt Pixel, die außerhalb der Leinwand verschoben wurden, mit Inhalten von der gegenüberliegenden Kante; RepeatEdgePixels erweitert stattdessen die Randfarben.
  5. Aktualisieren der Sammlung – SmartFilters.Filters wird als Array bereitgestellt. Durch Kopieren in eine List<SmartFilter>, Hinzufügen des neuen Filters und Zurückzuweisen von ToArray() bleiben bereits vorhandene Smart‑Filter auf der Ebene erhalten.
  6. Persistieren der Änderungen – UpdateResourceValues() schreibt die Filtersammlung in die PSD‑Ressourcen der Ebene. Wird dieser Aufruf übersprungen, geht der neue Filter beim Speichern verloren.
  7. Speichern – image.Save(outputFile) schreibt das aktualisierte PSD auf die Festplatte.

So lesen Sie Displace Smart Filter-Daten in C#

Nachdem Sie die PSD gespeichert haben, können Sie sie erneut laden und die Filtereigenschaften prüfen, um zu bestätigen, dass jeder Wert korrekt gespeichert wurde. Der gleiche Ansatz funktioniert für PSD-Dateien, die in Photoshop erstellt wurden.

Das folgende C#-Beispiel liest den Displace Smart-Filter zurück und validiert seine Einstellungen.

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

Erklärung

  1. Neuladen der Datei – Image.Load öffnet das im vorherigen Schritt gespeicherte PSD.
  2. Lokalisieren der Smart Object‑Ebene – Die gleiche typbasierte Suche sorgt dafür, dass die Lese‑ und Schreibvorgänge konsistent bleiben.
  3. Filtern nach Typ finden – OfType<DisplaceSmartFilter>().LastOrDefault() gibt den zuletzt hinzugefügten Displace‑Filter zurück und erzeugt niemals einen ungültigen Cast. Das ist zuverlässiger als das letzte Array‑Element zu lesen und mit as zu casten, was stillschweigend null zurückgibt, wenn an dieser Position ein anderer Filter sitzt.
  4. Eigenschaften lesen – Alle Filtereinstellungen sind als typisierte Eigenschaften verfügbar, sodass sie protokolliert, verglichen oder in einen Bericht exportiert werden können.
  5. Validierung – Der AssertAreEqual‑Hilfsfunktion vergleicht persistierte Werte mit den Originalwerten und wirft bei einer Abweichung eine aussagekräftige Fehlermeldung.

Fazit

Mit der Klasse DisplaceSmartFilter in Aspose.PSD for .NET können C#‑Entwickler Photoshop‑Displace‑Smart‑Filter vollständig im Code hinzufügen, konfigurieren, speichern und wieder auslesen. Der Filter bleibt nicht destruktiv und editierbar in Photoshop, die Displacements‑Karte kann innerhalb der PSD transportiert werden, und dieselbe API unterstützt eine Rundreise‑Validierung. Damit lässt sich auf .NET‑Basis problemlos Mockup‑Generatoren, Vorlagen‑Pipelines und PSD‑Audit‑Tools erstellen.

FAQs

  1. Welche Version von Aspose.PSD for .NET unterstützt den Displace smart filter? Das Lesen und Schreiben von Displace smart filter Daten wurde in Aspose.PSD for .NET 26.8 eingeführt. Verwenden Sie Version 26.8 oder höher, um auf die Klasse DisplaceSmartFilter zuzugreifen.

  2. Kann ich einen DisplaceSmartFilter zu einer regulären Rasterebene hinzufügen? Smart-Filter-Daten werden mit Smart Object-Ebenen gespeichert, sodass der Filter zur SmartFilters-Sammlung einer SmartObjectLayer hinzugefügt werden muss. Wenn Ihr Inhalt sich auf einer regulären Ebene befindet, konvertieren Sie ihn zuerst in ein Smart Object.

  3. Wie bette ich die Displacement-Map in die PSD ein? Übergeben Sie den Pfad der Displacement-Map und true an den Konstruktor von DisplaceSmartFilter. Nach dem Speichern gibt IsDisplacementMapEmbedded true zurück und DisplaceMapData enthält die eingebetteten Kartendaten.

  4. Welche Werte kann die UndefinedAreas‑Eigenschaft annehmen? UndefinedAreas unterstützt WrapAround, das undefinierte Pixel mit Inhalt von der gegenüberliegenden Kante des Bildes füllt, und RepeatEdgePixels, das die Farben der Randpixel erweitert.

  5. Was ist der Unterschied zwischen DisplacementMethod.Tile und DisplacementMethod.Stretch? Tile wiederholt die Displacementskarte über die Ebene in ihrer ursprünglichen Größe, während Stretch die Karte so skaliert, dass sie in die Ebene passt.

  6. Muss ich UpdateResourceValues aufrufen, nachdem ich Smart-Filter geändert habe? Ja. UpdateResourceValues schreibt die geänderte Filtersammlung in die Ressourcen der Smart Object‑Ebene. Ohne ihn wird der neue Filter beim Speichern nicht beibehalten.

Holen Sie sich eine kostenlose Lizenz und entdecken Sie mehr

Evaluieren Sie Aspose.PSD for .NET ohne Einschränkungen, indem Sie eine temporäre Lizenz anfordern:

Kostenlose temporäre Lizenz erhalten

Zusätzliche Ressourcen für die Arbeit mit PSD-Dateien in .NET:

Weiterlesen