Filtr Displace je jedním z nejužitečnějších nástrojů pro zkreslení v aplikaci Photoshop. Deformuje pixely vrstvy podle hodnot jasu samostatné mapy posunutí, což je způsob, jakým designéři obalují grafiku kolem záhybů látky, přidávají efekty vlnění nebo umisťují loga na texturované povrchy. Když je tento filtr aplikován jako chytrý filtr, jeho nastavení jsou uložena přímo v souboru PSD a zůstávají plně editovatelná. Tento článek ukazuje, jak číst a zapisovat data chytrého filtru Displace v C#. Přidáte filtr Displace jako chytrý filtr do vrstvy Smart Object, nastavíte jeho měřítko a možnosti zpracování okrajů, vložíte mapu posunutí, uložíte PSD a poté načtete nastavení filtru zpět, abyste ověřili kompletní cyklus — a to vše bez nainstalovaného Adobe Photoshopu.

Klíčové poznatky

  • Třída DisplaceSmartFilter, dostupná v Aspose.PSD for .NET 26.8 a novějších, zpřístupňuje filtr Photoshop Displace jako silně typovaný objekt .NET.
  • Horizontální a vertikální měřítko, metoda posunu (Tile nebo Stretch) a zpracování nedefinovaných oblastí (WrapAround nebo RepeatEdgePixels) jsou všechny jednoduché vlastnosti pro čtení/zápis.
  • Mapa posunu může být vložena do výstupního souboru PSD předáním hodnoty true do konstruktoru, což udržuje soubor samostatný a přenosný.
  • Po změně kolekce filtrů je nutné zavolat SmartFilters.UpdateResourceValues(), jinak se změny neuloží.
  • Stejné API načítá data filtrů zpět z existujících souborů PSD, což jej činí vhodným pro validaci, audit a dávkové zpracování.

Proč je důležitý Displace Smart Filter

Automatizační pipeline pro design často potřebují ve velkém reprodukovat efekty Photoshopu. Typické příklady zahrnují vytváření produktových mockupů, kde potisk sleduje záhyby trička, tvorbu variant šablon pro marketingové týmy nebo audit knihovny PSD šablon, aby se potvrdilo, že každý soubor používá stejné nastavení filtru.

Provádění tohoto ručně ve Photoshopu není škálovatelné a sloučení efektu do pixelů ztrácí možnost jej později upravovat. Čtením a zápisem dat chytrého filtru Displace v C# si zachováte neškodlivý a editovatelný filtr ve Photoshopu, přičemž jej můžete ovládat ze serverového kódu, úloh na pozadí nebo desktopových nástrojů.

Použití Aspose.PSD pro čtení a zápis dat filtru Displace Smart

Aspose.PSD for .NET umožňuje vývojářům C# číst a zapisovat data chytrého filtru Displace přímo prostřednictvím třídy DisplaceSmartFilter.

Začínáme

Nainstalujte Aspose.PSD NuGet balíček (verze 26.8 nebo novější) z konzole správce balíčků:

Install-Package Aspose.PSD

Nebo použijte .NET CLI:

dotnet add package Aspose.PSD

Níže uvedené příklady používají následující jmenné prostory:

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;

Bude také potřeba dva vstupní soubory: PSD, který obsahuje alespoň jednu vrstvu Smart Object, a PSD, který použijete jako mapu posunu. Pro podrobnosti o API viz dokumentace Aspose.PSD for .NET a průvodce chytrými filtry.

Vlastnosti DisplaceSmartFilter na první pohled

PropertyTypePurpose
HorizontalScaledoubleMěřítko horizontálního posunu, jak v dialogu Displace ve Photoshopu
VerticalScaledoubleMěřítko vertikálního posunu
DisplacementMethodDisplacementMethodTile opakuje mapu; Stretch mění velikost mapy tak, aby odpovídala vrstvě
UndefinedAreasUndefinedAreasWrapAround nebo RepeatEdgePixels pro pixely posunuté mimo vrstvu
IsDisplacementMapEmbeddedboolIndikuje, zda je mapa vložena v souboru PSD
DisplaceMapData—Vložená data mapy posunu
DisplacementMapPathstringCesta k mapě posunu

Jak přidat Displace Smart Filter v C#

Prvním krokem je načíst PSD, který obsahuje vrstvu Smart Object. Poté vytvoříte DisplaceSmartFilter, nakonfigurujete jeho vlastnosti, přidáte jej do kolekce smart filtrů vrstvy a uložíte výsledek.

Následující příklad v C# přidá a nakonfiguruje chytrý filtr Displace na vrstvě 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);
}

Vysvětlení

  1. Načítání PSD – Image.Load vrací obecný Image, který je přetypován na PsdImage, aby bylo možné přistupovat k funkcím specifickým pro PSD, jako jsou vrstvy a chytré filtry.
  2. Vyhledání vrstvy Smart Object – OfType<SmartObjectLayer>() vybere první vrstvu Smart Object a při jejím neexistenci selže s jasnou zprávou. To je bezpečnější než přímo indexovat Layers, protože pořadí vrstev se mezi soubory liší.
  3. Vytvoření filtru – Konstruktor DisplaceSmartFilter(string, bool) přijímá cestu k mapě posunu a příznak, který určuje, zda je mapa vložena. Předáním true se výstupní PSD stane samostatným.
  4. Konfigurace filtru – HorizontalScale a VerticalScale nastavují sílu posunu. DisplacementMethod.Tile opakuje mapu po celé vrstvě, zatímco Stretch ji přizpůsobí velikosti. UndefinedAreas.WrapAround vyplní pixely posunuté mimo plátno obsahem z opačného okraje; RepeatEdgePixels místo toho prodlouží barvy okraje.
  5. Aktualizace kolekce – SmartFilters.Filters je vystaven jako pole. Zkopírováním do List<SmartFilter>, přidáním nového filtru a přiřazením zpět pomocí ToArray() se zachovají všechny chytré filtry, které již na vrstvě byly.
  6. Uložení změn – UpdateResourceValues() zapíše kolekci filtrů do PSD zdrojů vrstvy. Pokud tento volání vynecháte, nový filtr se při uložení ztratí.
  7. Ukládání – image.Save(outputFile) zapíše aktualizovaný PSD na disk.

Jak načíst data chytrého filtru Displace v C#

Po uložení souboru PSD jej můžete znovu načíst a zkontrolovat vlastnosti filtru, abyste potvrdili, že každá hodnota byla správně uložena. Stejný postup funguje i pro soubory PSD vytvořené ve Photoshopu.

Následující příklad v C# načte zpět chytrý filtr Displace a ověří jeho nastavení.

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

Vysvětlení

  1. Znovunačtení souboru – Image.Load otevře PSD uložený v předchozím kroku.
  2. Vyhledání vrstvy Smart Object – Stejný typově založený výběr udržuje kroky čtení a zápisu konzistentní.
  3. Nalezení filtru podle typu – OfType<DisplaceSmartFilter>().LastOrDefault() vrací naposledy přidaný filtr Displace a nikdy nevyvolá neplatný převod typu. To je spolehlivější než číst poslední prvek pole a provádět převod pomocí as, který tiše vrátí null, pokud se na dané pozici nachází jiný filtr.
  4. Čtení vlastností – Všechna nastavení filtru jsou dostupná jako typované vlastnosti, takže je lze zaznamenávat, porovnávat nebo exportovat do zprávy.
  5. Validace – Pomocná funkce AssertAreEqual porovnává uložené hodnoty s původními hodnotami a při jakémkoli nesouladu vyvolá výjimku s popisnou zprávou.

Závěr

S třídou DisplaceSmartFilter v Aspose.PSD for .NET mohou vývojáři v C# přidávat, konfigurovat, ukládat a načítat zpět Photoshop Displace smart filtry kompletně v kódu. Filtr zůstává nedestruktivní a upravitelný ve Photoshopu, mapa posunu může cestovat uvnitř PSD a stejné API podporuje validaci round‑trip. To usnadňuje vytváření generátorů maket, šablonových pipeline a nástrojů pro auditování PSD nad .NET.

Často kladené otázky

  1. Která verze Aspose.PSD for .NET podporuje chytrý filtr Displace? Čtení a zápis dat chytrého filtru Displace bylo zavedeno v Aspose.PSD for .NET 26.8. Použijte verzi 26.8 nebo novější pro přístup ke třídě DisplaceSmartFilter.

  2. Mohu přidat DisplaceSmartFilter k běžné rastrové vrstvě? Data chytrých filtrů jsou uložena ve vrstvách Smart Object, takže filtr musí být přidán do kolekce SmartFilters vrstvy SmartObjectLayer. Pokud je váš obsah na běžné vrstvě, nejprve jej převeďte na Smart Object.

  3. Jak vložit mapu posunu do PSD? Předávejte cestu k mapě posunu a true do konstruktoru DisplaceSmartFilter. Po uložení vrátí IsDisplacementMapEmbedded hodnotu true a DisplaceMapData obsahuje vložená data mapy.

  4. Jaké hodnoty může vlastnost UndefinedAreas nabývat? UndefinedAreas podporuje WrapAround, který vyplňuje nedefinované pixely obsahem z opačného okraje obrázku, a RepeatEdgePixels, který rozšiřuje barvy okrajových pixelů.

  5. Jaký je rozdíl mezi DisplacementMethod.Tile a DisplacementMethod.Stretch? Tile opakuje mapu posunu po celé vrstvě v její původní velikosti, zatímco Stretch mění velikost mapy tak, aby odpovídala vrstvě.

  6. Musím zavolat UpdateResourceValues po úpravě chytrých filtrů? Ano. UpdateResourceValues zapisuje upravenou kolekci filtrů do zdrojů vrstvy Smart Object. Bez toho se nový filtr neuloží při uložení.

Získejte bezplatnou licenci a objevte více

Vyzkoušejte Aspose.PSD for .NET bez omezení požádáním o dočasnou licenci:

Získat bezplatnou dočasnou licenci

Další zdroje pro práci se soubory PSD v .NET:

Číst dál