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 (
TileoderStretch) und die Behandlung von undefinierten Bereichen (WrapAroundoderRepeatEdgePixels) sind einfache Lese‑/Schreib‑Eigenschaften. - Die Verschiebungskarte kann in das Ausgab‑PSD eingebettet werden, indem
truean 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
| Eigenschaft | Typ | Zweck |
|---|---|---|
HorizontalScale | double | Horizontale Verschiebungsskala, wie im Displace-Dialog von Photoshop |
VerticalScale | double | Vertikale Verschiebungsskala |
DisplacementMethod | DisplacementMethod | Tile wiederholt die Karte; Stretch ändert die Größe der Karte, um sie an die Ebene anzupassen |
UndefinedAreas | UndefinedAreas | WrapAround oder RepeatEdgePixels für Pixel, die außerhalb der Ebene verschoben wurden |
IsDisplacementMapEmbedded | bool | Gibt an, ob die Karte im PSD eingebettet ist |
DisplaceMapData | — | Die eingebetteten Displacementskartendaten |
DisplacementMapPath | string | Der 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
- Laden der PSD –
Image.Loadgibt ein generischesImagezurück, das zuPsdImageumgewandelt wird, um PSD‑spezifische Funktionen wie Ebenen und Smart‑Filter zu nutzen. - 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 vonLayers, da die Ebenenreihenfolge zwischen Dateien variieren kann. - 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 vontruemacht das resultierende PSD eigenständig. - Konfigurieren des Filters –
HorizontalScaleundVerticalScalelegen die Stärke der Verschiebung fest.DisplacementMethod.Tilewiederholt die Karte über die Ebene, währendStretchsie anpasst, um zu passen.UndefinedAreas.WrapAroundfüllt Pixel, die außerhalb der Leinwand verschoben wurden, mit Inhalten von der gegenüberliegenden Kante;RepeatEdgePixelserweitert stattdessen die Randfarben. - Aktualisieren der Sammlung –
SmartFilters.Filterswird als Array bereitgestellt. Durch Kopieren in eineList<SmartFilter>, Hinzufügen des neuen Filters und Zurückzuweisen vonToArray()bleiben bereits vorhandene Smart‑Filter auf der Ebene erhalten. - Persistieren der Änderungen –
UpdateResourceValues()schreibt die Filtersammlung in die PSD‑Ressourcen der Ebene. Wird dieser Aufruf übersprungen, geht der neue Filter beim Speichern verloren. - 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
- Neuladen der Datei –
Image.Loadöffnet das im vorherigen Schritt gespeicherte PSD. - Lokalisieren der Smart Object‑Ebene – Die gleiche typbasierte Suche sorgt dafür, dass die Lese‑ und Schreibvorgänge konsistent bleiben.
- 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 mitaszu casten, was stillschweigendnullzurückgibt, wenn an dieser Position ein anderer Filter sitzt. - Eigenschaften lesen – Alle Filtereinstellungen sind als typisierte Eigenschaften verfügbar, sodass sie protokolliert, verglichen oder in einen Bericht exportiert werden können.
- 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
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
DisplaceSmartFilterzuzugreifen.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 einerSmartObjectLayerhinzugefügt werden muss. Wenn Ihr Inhalt sich auf einer regulären Ebene befindet, konvertieren Sie ihn zuerst in ein Smart Object.Wie bette ich die Displacement-Map in die PSD ein? Übergeben Sie den Pfad der Displacement-Map und
truean den Konstruktor vonDisplaceSmartFilter. Nach dem Speichern gibtIsDisplacementMapEmbeddedtruezurück undDisplaceMapDataenthält die eingebetteten Kartendaten.Welche Werte kann die UndefinedAreas‑Eigenschaft annehmen?
UndefinedAreasunterstütztWrapAround, das undefinierte Pixel mit Inhalt von der gegenüberliegenden Kante des Bildes füllt, undRepeatEdgePixels, das die Farben der Randpixel erweitert.Was ist der Unterschied zwischen DisplacementMethod.Tile und DisplacementMethod.Stretch?
Tilewiederholt die Displacementskarte über die Ebene in ihrer ursprünglichen Größe, währendStretchdie Karte so skaliert, dass sie in die Ebene passt.Muss ich UpdateResourceValues aufrufen, nachdem ich Smart-Filter geändert habe? Ja.
UpdateResourceValuesschreibt 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:
- Aspose.PSD für .NET Dokumentation
- Aspose.PSD für .NET API-Referenz
- Smart-Filter-Manipulation in Aspose.PSD für C#
- Kostenlose Online-PSD-Tools
