Displace‑filter är ett av Photoshops mest användbara förvrängningsverktyg. Det deformerar ett lagers pixlar enligt ljusstyrkevärdena i en separat förskjutningskarta, vilket är hur designers omsluter grafik runt tygveck, lägger till krusningseffekter eller placerar logotyper på strukturerade ytor. När filtret appliceras som ett smart filter lagras dess inställningar i PSD‑filen och förblir fullt redigerbara. Denna artikel visar hur man läser och skriver data för Displace smart filter i C#. Du kommer att lägga till ett Displace smart filter på ett Smart Object‑lager, konfigurera dess skala‑ och kant‑hanteringsalternativ, bädda in förskjutningskartan, spara PSD‑filen och sedan läsa tillbaka filterinställningarna för att verifiera hela processen — allt utan att Adobe Photoshop är installerat.

Viktiga slutsatser

  • DisplaceSmartFilter-klassen, tillgänglig i Aspose.PSD for .NET 26.8 och senare, exponerar Photoshop Displace-filter som ett starkt typat .NET-objekt.
  • Horisontell och vertikal skala, förskjutningsmetod (Tile eller Stretch) och hantering av odefinierade områden (WrapAround eller RepeatEdgePixels) är alla enkla läs/skriv‑egenskaper.
  • Förskjutningskartan kan bäddas in i den resulterande PSD-filen genom att skicka true till konstruktorn, vilket gör filen självständig och portabel.
  • SmartFilters.UpdateResourceValues() måste anropas efter att filterkollektionen har ändrats, annars sparas ändringarna inte.
  • Samma API läser filterdata tillbaka från befintliga PSD-filer, vilket gör det lämpligt för validering, granskning och batchbearbetning.

Varför Displace Smart Filter är viktigt

Designautomationspipelines behöver ofta reproducera Photoshop‑effekter i stor skala. Vanliga exempel inkluderar att skapa produktmockups där en tryckdesign följer veckningarna på en T‑shirt, producera mallvarianter för marknadsföringsteam, eller granska ett bibliotek av PSD‑mallar för att bekräfta att varje fil använder samma filterinställningar.

Att göra detta för hand i Photoshop skalar inte, och att platta till effekten till pixlar förlorar möjligheten att redigera den senare. Genom att läsa och skriva Displace smart filter data i C# behåller du filtret icke‑destruktivt och redigerbart i Photoshop, samtidigt som du styr det från server‑sidkod, bakgrundsjobb eller skrivbordsverktyg.

Användning av Aspose.PSD för att läsa och skriva Displace Smart Filter-data

Aspose.PSD for .NET gör det möjligt för C#-utvecklare att läsa och skriva Displace smart filter-data direkt via DisplaceSmartFilter-klassen.

Kom igång

Installera Aspose.PSD NuGet package (version 26.8 eller senare) från Package Manager Console:

Install-Package Aspose.PSD

Eller använd .NET CLI:

dotnet add package Aspose.PSD

Exemplen nedan använder följande namnrymder:

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;

Du kommer också att behöva två inmatningsfiler: en PSD som innehåller minst ett Smart Object‑lager och en PSD att använda som förskjutningskarta. För API‑detaljer, se Aspose.PSD for .NET-dokumentation och guide för smarta filter.

DisplaceSmartFilter-egenskaper i översikt

EgenskapTypSyfte
HorizontalScaledoubleHorisontell förskjutningsskala, som i Photoshop’s Displace-dialog
VerticalScaledoubleVertikal förskjutningsskala
DisplacementMethodDisplacementMethodTile upprepar kartan; Stretch ändrar storlek på kartan så att den passar lagret
UndefinedAreasUndefinedAreasWrapAround eller RepeatEdgePixels för pixlar som flyttas utanför lagret
IsDisplacementMapEmbeddedboolAnger om kartan är inbäddad i PSD
DisplaceMapData—De inbäddade förskjutningskartsdata
DisplacementMapPathstringSökvägen till förskjutningskartan

Hur man lägger till ett Displace Smart Filter i C#

Det första steget är att ladda en PSD som innehåller ett Smart Object‑lager. Du skapar sedan en DisplaceSmartFilter, konfigurerar dess egenskaper, lägger till den i lagrets smarta filter‑samling och sparar resultatet.

Följande C#-exempel lägger till och konfigurerar ett Displace smart filter på ett Smart Object‑lager.

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

Förklaring

  1. Laddar PSD – Image.Load returnerar en generisk Image, som kastas till PsdImage för att komma åt PSD‑specifika funktioner såsom lager och smarta filter.
  2. Hitta Smart Object‑lagret – OfType<SmartObjectLayer>() väljer det första Smart Object‑lagret och misslyckas med ett tydligt meddelande om inget finns. Detta är säkrare än att indexera direkt i Layers, eftersom lagerordningen varierar mellan filer.
  3. Skapa filtret – Konstruktorn DisplaceSmartFilter(string, bool) tar sökvägen till förskjutningskartan och en flagga som styr om kartan bäddas in. Att skicka true gör den sparade PSD‑filen självständig.
  4. Konfigurera filtret – HorizontalScale och VerticalScale anger förskjutningsstyrkan. DisplacementMethod.Tile upprepar kartan över lagret, medan Stretch ändrar storlek för att passa. UndefinedAreas.WrapAround fyller pixlar som flyttats utanför duken med innehåll från motsatt kant; RepeatEdgePixels förlänger kantfärgerna istället.
  5. Uppdatera samlingen – SmartFilters.Filters exponeras som en array. Genom att kopiera den till en List<SmartFilter>, lägga till det nya filtret och tilldela ToArray() tillbaka bevaras eventuella smarta filter som redan fanns på lagret.
  6. Spara förändringarna – UpdateResourceValues() skriver filterkollektionen till lagrets PSD‑resurser. Hoppar man över detta anrop försvinner det nya filtret vid sparning.
  7. Spara – image.Save(outputFile) skriver den uppdaterade PSD‑filen till disk.

Hur man läser Displace Smart Filter-data i C#

Efter att du har sparat PSD-filen kan du läsa in den igen och inspektera filteregenskaperna för att bekräfta att varje värde har sparats korrekt. Samma metod fungerar för PSD-filer som skapats i Photoshop.

Följande C#-exempel läser tillbaka Displace smartfilter och validerar dess inställningar.

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

Förklaring

  1. Laddar om filen – Image.Load öppnar PSD-filen som sparades i föregående steg.
  2. Hitta Smart Object-lagret – Den samma typbaserade uppslagningen håller läs- och skrivstegen konsekventa.
  3. Hitta filtret efter typ – OfType<DisplaceSmartFilter>().LastOrDefault() returnerar det senast tillagda Displace-filtret och ger aldrig en ogiltig typkonvertering. Detta är mer pålitligt än att läsa det sista arrayelementet och kasta med as, vilket tyst returnerar null om ett annat filter sitter på den positionen.
  4. Läsa egenskaper – Alla filterinställningar är tillgängliga som typade egenskaper, så de kan loggas, jämföras eller exporteras till en rapport.
  5. Validering – AssertAreEqual-hjälpen jämför sparade värden med de ursprungliga värdena och kastar ett undantag med ett beskrivande meddelande vid någon avvikelse.

Slutsats

Med DisplaceSmartFilter-klassen i Aspose.PSD for .NET kan C#‑utvecklare lägga till, konfigurera, spara och läsa tillbaka Photoshop Displace‑smartfilter helt i kod. Filtret förblir icke‑destruktivt och redigerbart i Photoshop, förskjutningskartan kan färdas inom PSD‑filen, och samma API stödjer rundresvalidering. Detta gör det enkelt att bygga mockup‑generatorer, mall‑pipelines och PSD‑granskningsverktyg ovanpå .NET.

Vanliga frågor

  1. Vilken version av Aspose.PSD for .NET stöder Displace smart filter? Läsning och skrivning av Displace smart filter‑data introducerades i Aspose.PSD for .NET 26.8. Använd version 26.8 eller senare för att komma åt klassen DisplaceSmartFilter.

  2. Kan jag lägga till ett DisplaceSmartFilter på ett vanligt rasterlager? Smart filterdata lagras med Smart Object-lager, så filtret måste läggas till i SmartFilters-samlingen av ett SmartObjectLayer. Om ditt innehåll är på ett vanligt lager, konvertera det först till ett Smart Object.

  3. Hur bäddar jag in förskjutningskartan i PSD? Skicka sökvägen till förskjutningskartan och true till DisplaceSmartFilter-konstruktorn. Efter sparning returnerar IsDisplacementMapEmbedded true och DisplaceMapData innehåller den inbäddade kartdata.

  4. Vilka värden kan egenskapen UndefinedAreas anta? UndefinedAreas stöder WrapAround, vilket fyller odefinierade pixlar med innehåll från motsatt kant av bilden, och RepeatEdgePixels, vilket utökar färgerna på kantpixlarna.

  5. Vad är skillnaden mellan DisplacementMethod.Tile och DisplacementMethod.Stretch?
    Tile upprepar förskjutningskartan över lagret i dess ursprungliga storlek, medan Stretch ändrar kartans storlek så att den passar lagret.

  6. Måste jag anropa UpdateResourceValues efter att ha ändrat smarta filter?
    Ja. UpdateResourceValues skriver den ändrade filterkollektionen till Smart Object‑lagrets resurser. Utan den sparas det nya filtret inte när du sparar.

Skaffa en gratis licens och utforska mer

Utvärdera Aspose.PSD for .NET utan begränsningar genom att begära en tillfällig licens:

Få en gratis tillfällig licens

Ytterligare resurser för att arbeta med PSD-filer i .NET:

Läs mer