Filtr Displace jest jednym z najbardziej przydatnych narzędzi zniekształcania w programie Photoshop. Przekształca piksele warstwy zgodnie z wartościami jasności oddzielnej mapy przemieszczenia, co pozwala projektantom owinąć grafikę wokół fałdów tkaniny, dodać efekty falowania lub dopasować logotypy do teksturowanych powierzchni. Gdy filtr jest zastosowany jako filtr inteligentny, jego ustawienia znajdują się w pliku PSD i pozostają w pełni edytowalne. Ten artykuł pokazuje, jak odczytywać i zapisywać dane filtru inteligentnego Displace w języku C#. Dodasz filtr inteligentny Displace do warstwy Smart Object, skonfigurujesz jego skalę i opcje obsługi krawędzi, osadzisz mapę przemieszczenia, zapiszesz plik PSD, a następnie odczytasz ustawienia filtru, aby zweryfikować pełny cykl — wszystko bez zainstalowanego programu Adobe Photoshop.

Najważniejsze wnioski

  • Klasa DisplaceSmartFilter, dostępna w Aspose.PSD for .NET 26.8 i nowszych, udostępnia filtr Photoshop Displace jako silnie typowany obiekt .NET.
  • Skala pozioma i pionowa, metoda przemieszczenia (Tile lub Stretch) oraz obsługa obszaru niezdefiniowanego (WrapAround lub RepeatEdgePixels) to proste właściwości odczytu/zapisu.
  • Mapa przemieszczenia może być osadzona w wyjściowym pliku PSD poprzez przekazanie true do konstruktora, co utrzymuje plik jako samodzielny i przenośny.
  • SmartFilters.UpdateResourceValues() musi być wywołane po zmianie kolekcji filtrów, w przeciwnym razie zmiany nie zostaną zapisane.
  • To samo API odczytuje dane filtrów z istniejących plików PSD, co czyni je odpowiednim do walidacji, audytu i przetwarzania wsadowego.

Dlaczego Displace Smart Filter ma znaczenie

Automatyzowane pipeline’ów projektowych często muszą odtwarzać efekty Photoshopa w dużej skali. Typowe przykłady obejmują generowanie mockupów produktów, w których projekt nadruku podąża za fałdami koszulki, tworzenie wariantów szablonów dla zespołów marketingowych lub audyt biblioteki szablonów PSD w celu potwierdzenia, że każdy plik używa tych samych ustawień filtru.

Robienie tego ręcznie w Photoshopie nie jest skalowalne, a spłaszczenie efektu do pikseli powoduje utratę możliwości późniejszej edycji. Czytając i zapisując dane inteligentnego filtru Displace w C#, zachowujesz filtr nieniszczący i edytowalny w Photoshopie, jednocześnie kontrolując go z kodu po stronie serwera, zadań w tle lub narzędzi desktopowych.

Używanie Aspose.PSD do odczytu i zapisu danych filtru Displace Smart

Aspose.PSD for .NET umożliwia programistom C# odczytywanie i zapisywanie danych filtru smart Displace bezpośrednio przy użyciu klasy DisplaceSmartFilter.

Rozpoczęcie

Zainstaluj Aspose.PSD NuGet package (wersja 26.8 lub nowsza) z konsoli Menedżera pakietów:

Install-Package Aspose.PSD

Lub użyj .NET CLI:

dotnet add package Aspose.PSD

Poniższe przykłady używają następujących przestrzeni nazw:

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;

Będziesz potrzebować dwóch plików wejściowych: pliku PSD, który zawiera co najmniej jedną warstwę Smart Object, oraz pliku PSD, który będzie użyty jako mapa przemieszczeń. Szczegóły API znajdziesz w Aspose.PSD for .NET documentation oraz w smart filters guide.

DisplaceSmartFilter Właściwości w skrócie

PropertyTypePurpose
HorizontalScaledoubleSkala przemieszczenia w poziomie, tak jak w oknie dialogowym Displace programu Photoshop
VerticalScaledoubleSkala przemieszczenia w pionie
DisplacementMethodDisplacementMethodTile powtarza mapę; Stretch zmienia rozmiar mapy, aby dopasować ją do warstwy
UndefinedAreasUndefinedAreasWrapAround lub RepeatEdgePixels dla pikseli przesuniętych poza warstwę
IsDisplacementMapEmbeddedboolWskazuje, czy mapa jest osadzona w pliku PSD
DisplaceMapData—Osadzone dane mapy przemieszczenia
DisplacementMapPathstringŚcieżka do mapy przemieszczenia

Jak dodać inteligentny filtr Displace w C#

Pierwszym krokiem jest załadowanie pliku PSD zawierającego warstwę Smart Object. Następnie tworzysz DisplaceSmartFilter, konfigurujesz jego właściwości, dodajesz go do kolekcji filtrów inteligentnych warstwy i zapisujesz wynik.

Poniższy przykład w C# dodaje i konfiguruje filtr inteligentny Displace na warstwie obiektu inteligentnego.

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

Wyjaśnienie

  1. Loading the PSD – Image.Load zwraca ogólny Image, który jest rzutowany na PsdImage, aby uzyskać dostęp do specyficznych dla PSD funkcji, takich jak warstwy i inteligentne filtry.
  2. Finding the Smart Object layer – OfType<SmartObjectLayer>() wybiera pierwszą warstwę Smart Object i zgłasza wyraźny komunikat, jeśli takiej nie ma. Jest to bezpieczniejsze niż bezpośrednie indeksowanie Layers, ponieważ kolejność warstw może się różnić w zależności od pliku.
  3. Creating the filter – Konstruktor DisplaceSmartFilter(string, bool) przyjmuje ścieżkę do mapy przemieszczenia oraz flagę określającą, czy mapa ma być osadzona. Przekazanie true sprawia, że wyjściowy PSD jest samodzielny.
  4. Configuring the filter – HorizontalScale i VerticalScale ustawiają siłę przemieszczenia. DisplacementMethod.Tile powtarza mapę na całej warstwie, natomiast Stretch zmienia jej rozmiar, aby dopasować. UndefinedAreas.WrapAround wypełnia piksele przesunięte poza obszar płótna treścią z przeciwległej krawędzi; RepeatEdgePixels rozszerza kolory krawędzi.
  5. Updating the collection – SmartFilters.Filters jest udostępniany jako tablica. Skopiowanie jej do List<SmartFilter>, dodanie nowego filtra i ponowne przypisanie wyniku ToArray() zachowuje wszystkie inteligentne filtry, które już znajdowały się na warstwie.
  6. Persisting the changes – UpdateResourceValues() zapisuje kolekcję filtrów w zasobach PSD warstwy. Pominięcie tego wywołania powoduje utratę nowego filtra przy zapisie.
  7. Saving – image.Save(outputFile) zapisuje zaktualizowany PSD na dysku.

Jak odczytać dane Displace Smart Filter w C#

Po zapisaniu pliku PSD możesz go ponownie wczytać i sprawdzić właściwości filtru, aby potwierdzić, że każda wartość została poprawnie zachowana. To samo podejście działa dla plików PSD utworzonych w Photoshopie.

Poniższy przykład w C# odczytuje inteligentny filtr Displace i weryfikuje jego ustawienia.

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

Wyjaśnienie

  1. Ponowne ładowanie pliku – Image.Load otwiera plik PSD zapisany w poprzednim kroku.
  2. Lokalizowanie warstwy Smart Object – To samo wyszukiwanie oparte na typie zapewnia spójność kroków odczytu i zapisu.
  3. Znajdowanie filtru według typu – OfType<DisplaceSmartFilter>().LastOrDefault() zwraca najnowszy dodany filtr Displace i nigdy nie powoduje nieprawidłowego rzutowania. Jest to bardziej niezawodne niż odczytywanie ostatniego elementu tablicy i rzutowanie przy użyciu as, które cicho zwraca null, jeśli w tej pozycji znajduje się inny filtr.
  4. Odczytywanie właściwości – Wszystkie ustawienia filtru są dostępne jako typowane właściwości, więc mogą być logowane, porównywane lub eksportowane do raportu.
  5. Walidacja – Pomocnik AssertAreEqual porównuje zapisane wartości z oryginalnymi i zgłasza wyjątek z opisową wiadomością przy jakiejkolwiek niezgodności.

Podsumowanie

Za pomocą klasy DisplaceSmartFilter w Aspose.PSD for .NET, programiści C# mogą dodawać, konfigurować, zapisywać i odczytywać filtry inteligentne Photoshop Displace w całości w kodzie. Filtr pozostaje niedestrukcyjny i edytowalny w Photoshopie, mapa przemieszczenia może podróżować wewnątrz pliku PSD, a to samo API obsługuje walidację round‑trip. Umożliwia to łatwe tworzenie generatorów mockupów, pipeline’ów szablonów oraz narzędzi do audytu PSD w oparciu o .NET.

FAQs

  1. Która wersja Aspose.PSD for .NET obsługuje filtr inteligentny Displace? Odczyt i zapis danych filtru inteligentnego Displace zostały wprowadzone w Aspose.PSD for .NET 26.8. Użyj wersji 26.8 lub nowszej, aby uzyskać dostęp do klasy DisplaceSmartFilter.

  2. Czy mogę dodać DisplaceSmartFilter do zwykłej warstwy rastrowej? Dane filtrów inteligentnych są przechowywane w warstwach Smart Object, więc filtr musi zostać dodany do kolekcji SmartFilters warstwy SmartObjectLayer. Jeśli twoja zawartość znajduje się na zwykłej warstwie, najpierw przekształć ją w Smart Object.

  3. Jak wstawić mapę przemieszczenia w pliku PSD? Podaj ścieżkę do mapy przemieszczenia i true do konstruktora DisplaceSmartFilter. Po zapisaniu, IsDisplacementMapEmbedded zwraca true i DisplaceMapData przechowuje wbudowane dane mapy.

  4. Jakie wartości może przyjmować właściwość UndefinedAreas?
    UndefinedAreas obsługuje WrapAround, które wypełnia niezdefiniowane piksele treścią z przeciwległego brzegu obrazu, oraz RepeatEdgePixels, które rozszerza kolory pikseli brzegowych.

  5. Jaka jest różnica między DisplacementMethod.Tile a DisplacementMethod.Stretch?
    Tile powtarza mapę przemieszczenia na warstwie w jej oryginalnym rozmiarze, natomiast Stretch zmienia rozmiar mapy, aby dopasować ją do warstwy.

  6. Czy muszę wywołać UpdateResourceValues po modyfikacji inteligentnych filtrów? Tak. UpdateResourceValues zapisuje zmodyfikowaną kolekcję filtrów w zasobach warstwy Smart Object. Bez tego nowy filtr nie zostanie zachowany po zapisaniu.

Uzyskaj darmową licencję i odkryj więcej

Wypróbuj Aspose.PSD for .NET bez ograniczeń, żądając tymczasowej licencji:

Uzyskaj darmową tymczasową licencję

Dodatkowe zasoby do pracy z plikami PSD w .NET:

Czytaj więcej