Фильтр 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 для чтения и записи данных смарт‑фильтра Displace

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

Начало работы

Установите Aspose.PSD пакет NuGet (версия 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 и руководство по умным фильтрам.

Свойства DisplaceSmartFilter в обзоре

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

Как добавить смарт‑фильтр Displace в 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 полностью в коде. Фильтр остаётся недеструктивным и редактируемым в Photoshop, карта смещения может находиться внутри PSD, а тот же API поддерживает проверку round‑trip. Это упрощает создание генераторов макетов, конвейеров шаблонов и инструментов аудита 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:

Читать дальше