Фільтр Displace — один із найкорисніших інструментів спотворення в Photoshop. Він деформує пікселі шару відповідно до значень яскравості окремої карти зсуву, що дозволяє дизайнерам обгорнути графіку навколо складок тканини, додати ефекти хвиль або розмістити логотипи на текстурованих поверхнях. Коли цей фільтр застосовується як смарт‑фільтр, його налаштування зберігаються у файлі PSD і залишаються повністю редагованими. У цій статті показано, як читати та записувати дані смарт‑фільтра Displace у C#. Ви додасте смарт‑фільтр Displace до шару Smart Object, налаштуєте його масштаб і параметри обробки країв, вбудуєте карту зсуву, збереже​те PSD, а потім зчитаєте налаштування фільтра, щоб перевірити коректність циклу — все без встановленого Adobe Photoshop.

Ключові висновки

  • Клас DisplaceSmartFilter, доступний у Aspose.PSD for .NET 26.8 та пізніше, надає фільтр Photoshop Displace як строго типізований .NET об’єкт.
  • Горизонтальне та вертикальне масштабування, метод зсуву (Tile або Stretch) та обробка невизначених ділянок (WrapAround або RepeatEdgePixels) — це прості властивості для читання/запису.
  • Карту зсуву можна вбудувати у вихідний PSD, передавши true конструктору, що робить файл самодостатнім та портативним.
  • Після зміни колекції фільтрів потрібно викликати SmartFilters.UpdateResourceValues(), інакше зміни не будуть збережені.
  • Той самий API зчитує дані фільтра з існуючих PSD‑файлів, що робить його придатним для валідації, аудиту та пакетної обробки.

Чому важливий Displace Smart Filter

Конвеєри автоматизації дизайну часто потребують масштабного відтворення ефектів Photoshop. Типові приклади включають створення макетів продукту, де дизайн друку слідує складкам футболки, створення варіацій шаблонів для маркетингових команд або аудит бібліотеки PSD‑шаблонів, щоб переконатися, що кожен файл використовує однакові налаштування фільтра.

Виконувати це вручну у Photoshop не масштабується, а перетворення ефекту у пікселі втрачає можливість редагувати його пізніше. Читаючи та записуючи дані розумного фільтра Displace у C#, ви зберігаєте фільтр недеструктивним і редагованим у Photoshop, одночасно керуючи ним з серверного коду, фонових завдань або настільних інструментів.

Використання Aspose.PSD для читання та запису даних розміщення Smart Filter

Aspose.PSD for .NET дозволяє розробникам C# читати та записувати дані розумного фільтра Displace безпосередньо через клас DisplaceSmartFilter.

Початок роботи

Встановіть Aspose.PSD NuGet package (версія 26.8 або новіша) з консолі диспетчера пакетів:

Install-Package Aspose.PSD

Або використайте .NET CLI:

dotnet add package Aspose.PSD

У наведених нижче прикладах використовуються такі простори імен:

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;

Вам також знадобляться два вхідних файли: PSD, який містить принаймні один шар Smart Object, і PSD, який буде використаний як карта зміщення. Для деталей API перегляньте Aspose.PSD for .NET documentation і smart filters guide.

Властивості DisplaceSmartFilter у стислому огляді

ВластивістьТипПризначення
HorizontalScaledoubleГоризонтальна шкала зсуву, як у діалоговому вікні Displace Photoshop
VerticalScaledoubleВертикальна шкала зсуву
DisplacementMethodDisplacementMethodTile повторює карту; Stretch змінює розмір карти, щоб вона відповідала шару
UndefinedAreasUndefinedAreasWrapAround або RepeatEdgePixels для пікселів, зміщених за межі шару
IsDisplacementMapEmbeddedboolВказує, чи карта вбудована у PSD
DisplaceMapData—Вбудовані дані карти зсуву
DisplacementMapPathstringШлях до карти зсуву

Як додати Displace Smart Filter у C#

Першим кроком є завантаження PSD, який містить шар Smart Object. Потім ви створюєте DisplaceSmartFilter, налаштовуєте його властивості, додаєте його до колекції смарт‑фільтрів шару та зберігаєте результат.

Наступний приклад C# додає та налаштовує розумний фільтр Displace на шарі 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);
}

Пояснення

  1. Завантаження PSD – Image.Load повертає загальний Image, який приводиться до PsdImage, щоб отримати доступ до специфічних для PSD функцій, таких як шари та смарт-фільтри.
  2. Пошук шару Smart Object – OfType<SmartObjectLayer>() вибирає перший шар Smart Object і виводить чітке повідомлення про помилку, якщо його немає. Це безпечніше, ніж індексувати Layers безпосередньо, оскільки порядок шарів може змінюватися між файлами.
  3. Створення фільтра – DisplaceSmartFilter(string, bool) конструктор приймає шлях до карти зміщення та прапорець, який визначає, чи буде карта вбудована. Передача true робить вихідний PSD самодостатнім.
  4. Налаштування фільтра – HorizontalScale і VerticalScale задають силу зміщення. DisplacementMethod.Tile повторює карту по всьому шару, тоді як Stretch змінює її розмір, щоб заповнити. UndefinedAreas.WrapAround заповнює пікселі, що вийшли за межі полотна, вмістом з протилежного краю; RepeatEdgePixels натомість розширює кольори краю.
  5. Оновлення колекції – SmartFilters.Filters представлений у вигляді масиву. Копіювання його в List<SmartFilter>, додавання нового фільтра та повернення ToArray() зберігає будь‑які смарт-фільтри, які вже були на шарі.
  6. Збереження змін – UpdateResourceValues() записує колекцію фільтрів у ресурси PSD шару. Якщо пропустити цей виклик, новий фільтр буде втрачений при збереженні.
  7. Збереження – image.Save(outputFile) записує оновлений PSD на диск.

Як прочитати дані розумного фільтра Displace у C#

Після збереження PSD ви можете перезавантажити його та перевірити властивості фільтра, щоб підтвердити, що кожне значення було правильно збережено. Такий же підхід працює для PSD‑файлів, створених у Photoshop.

Наступний приклад C# читає розумний фільтр Displace і перевіряє його налаштування.

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

Пояснення

  1. Перезавантаження файлу – Image.Load відкриває PSD, збережений на попередньому кроці.
  2. Знаходження шару Smart Object – Той самий пошук за типом забезпечує послідовність кроків читання та запису.
  3. Пошук фільтра за типом – OfType<DisplaceSmartFilter>().LastOrDefault() повертає найновіший доданий Displace‑фільтр і ніколи не викликає неправильного приведення типу. Це більш надійно, ніж читання останнього елементу масиву та приведення за допомогою as, яке без повідомлення повертає null, якщо в цій позиції знаходиться інший фільтр.
  4. Читання властивостей – Всі налаштування фільтра доступні як типізовані властивості, їх можна журналювати, порівнювати або експортувати у звіт.
  5. Валідація – Допоміжна функція AssertAreEqual порівнює збережені значення з оригінальними і викидає виключення з описовим повідомленням у разі будь-якої невідповідності.

Висновок

За допомогою класу DisplaceSmartFilter в Aspose.PSD for .NET розробники C# можуть додавати, налаштовувати, зберігати та зчитувати фільтри Photoshop Displace smart filters повністю в коді. Фільтр залишається недеструктивним і редагованим у Photoshop, карта зміщення може перебувати всередині PSD, а той самий API підтримує кругову перевірку. Це спрощує створення генераторів макетів, конвеєрів шаблонів та інструментів аудиту PSD на базі .NET.

Питання та відповіді

  1. Яка версія Aspose.PSD for .NET підтримує розумний фільтр Displace? Читання та запис даних розумного фільтра Displace було впроваджено в Aspose.PSD for .NET 26.8. Використовуйте версію 26.8 або новішу, щоб отримати доступ до класу DisplaceSmartFilter.

  2. Чи можу я додати DisplaceSmartFilter до звичайного растрового шару? Дані смарт-фільтра зберігаються разом зі слоями Smart Object, тому фільтр потрібно додати до колекції SmartFilters шару SmartObjectLayer. Якщо ваш вміст знаходиться на звичайному шарі, спочатку перетворіть його на Smart Object.

  3. Як вбудувати карту зміщення у PSD? Передайте шлях до карти зміщення та true конструктору DisplaceSmartFilter. Після збереження IsDisplacementMapEmbedded повертає true і DisplaceMapData містить вбудовані дані карти.

  4. Які значення може приймати властивість UndefinedAreas? UndefinedAreas підтримує WrapAround, який заповнює невизначені пікселі вмістом з протилежного краю зображення, та RepeatEdgePixels, який розширює кольори крайових пікселів.

  5. У чому різниця між DisplacementMethod.Tile та DisplacementMethod.Stretch? Tile повторює карту зміщення по всій шарі у її початковому розмірі, тоді як Stretch змінює розмір карти, щоб вона відповідала шару.

  6. Чи потрібно викликати UpdateResourceValues після зміни смарт-фільтрів? Так. UpdateResourceValues записує змінену колекцію фільтрів у ресурси шару Smart Object. Без цього новий фільтр не зберігається при збереженні.

Отримайте безкоштовну ліцензію та дізнайтеся більше

Оцініть Aspose.PSD for .NET без обмежень, запросивши тимчасову ліцензію:

Отримати безкоштовну тимчасову ліцензію

Додаткові ресурси для роботи з PSD‑файлами в .NET:

Читати далі