Фильтр 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 в обзоре
| Property | Type | Purpose |
|---|---|---|
HorizontalScale | double | Горизонтальный масштаб смещения, как в диалоговом окне Displace в Photoshop |
VerticalScale | double | Вертикальный масштаб смещения |
DisplacementMethod | DisplacementMethod | Tile повторяет карту; Stretch изменяет размер карты, чтобы она соответствовала слою |
UndefinedAreas | UndefinedAreas | WrapAround или RepeatEdgePixels для пикселей, смещённых за пределы слоя |
IsDisplacementMapEmbedded | bool | Указывает, встроена ли карта в PSD |
DisplaceMapData | — | Встроенные данные карты смещения |
DisplacementMapPath | string | Путь к карте смещения |
Как добавить смарт‑фильтр 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);
}
Объяснение
- Загрузка PSD –
Image.Loadвозвращает объект типаImage, который приводится кPsdImageдля доступа к специфическим для PSD функциям, таким как слои и умные фильтры. - Поиск слоя Smart Object –
OfType<SmartObjectLayer>()выбирает первый слой Smart Object и выдаёт чёткое сообщение об ошибке, если такой слой отсутствует. Это безопаснее, чем напрямую обращаться кLayersпо индексу, поскольку порядок слоёв может различаться в разных файлах. - Создание фильтра – Конструктор
DisplaceSmartFilter(string, bool)принимает путь к карте смещения и флаг, определяющий, будет ли карта встроена. Передачаtrueделает результирующий PSD автономным. - Настройка фильтра –
HorizontalScaleиVerticalScaleзадают силу смещения.DisplacementMethod.Tileповторяет карту по всему слою, тогда какStretchмасштабирует её под размер.UndefinedAreas.WrapAroundзаполняет пиксели, смещённые за пределы холста, содержимым с противоположного края;RepeatEdgePixelsвместо этого расширяет цвета краёв. - Обновление коллекции –
SmartFilters.Filtersпредоставляется в виде массива. Копирование его вList<SmartFilter>, добавление нового фильтра и последующее присвоение результатаToArray()сохраняет любые умные фильтры, уже находившиеся на слое. - Сохранение изменений –
UpdateResourceValues()записывает коллекцию фильтров в ресурсы PSD слоя. Пропуск этого вызова приводит к потере нового фильтра при сохранении. - Сохранение –
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}.");
}
}
Объяснение
- Перезагрузка файла –
Image.Loadоткрывает PSD, сохранённый на предыдущем шаге. - Поиск слоя Smart Object – Тот же поиск по типу сохраняет согласованность шагов чтения и записи.
- Поиск фильтра по типу –
OfType<DisplaceSmartFilter>().LastOrDefault()возвращает последний добавленный фильтр Displace и никогда не приводит к недопустимому привидению типов. Это надёжнее, чем чтение последнего элемента массива и приведение с помощьюas, которое молча возвращаетnull, если в этой позиции находится другой фильтр. - Чтение свойств – Все настройки фильтра доступны как типизированные свойства, поэтому их можно записывать в журнал, сравнивать или экспортировать в отчет.
- Валидация – Вспомогательная функция
AssertAreEqualсравнивает сохранённые значения с оригинальными и бросает исключение с описательным сообщением при любом несоответствии.
Заключение
С помощью класса DisplaceSmartFilter в Aspose.PSD for .NET разработчики на C# могут добавлять, настраивать, сохранять и считывать смарт‑фильтры Photoshop Displace полностью в коде. Фильтр остаётся недеструктивным и редактируемым в Photoshop, карта смещения может находиться внутри PSD, а тот же API поддерживает проверку round‑trip. Это упрощает создание генераторов макетов, конвейеров шаблонов и инструментов аудита PSD на основе .NET.
Часто задаваемые вопросы
Какая версия Aspose.PSD for .NET поддерживает смарт‑фильтр Displace? Чтение и запись данных смарт‑фильтра Displace было введено в Aspose.PSD for .NET 26.8. Используйте версию 26.8 или более новую, чтобы получить доступ к классу
DisplaceSmartFilter.Могу ли я добавить DisplaceSmartFilter к обычному растровому слою? Данные смарт‑фильтра хранятся в слоях Smart Object, поэтому фильтр необходимо добавить в коллекцию
SmartFiltersслояSmartObjectLayer. Если ваш контент находится на обычном слое, сначала преобразуйте его в Smart Object.Как встроить карту смещения в PSD? Передайте путь к карте смещения и
trueв конструкторDisplaceSmartFilter. После сохраненияIsDisplacementMapEmbeddedвозвращаетtrue, аDisplaceMapDataсодержит встроенные данные карты.Какие значения может принимать свойство UndefinedAreas?
UndefinedAreasподдерживаетWrapAround, который заполняет неопределённые пиксели содержимым с противоположного края изображения, иRepeatEdgePixels, который расширяет цвета краевых пикселей.В чем разница между DisplacementMethod.Tile и DisplacementMethod.Stretch?
Tileповторяет карту смещения по всему слою в её исходном размере, тогда какStretchизменяет размер карты, чтобы она соответствовала слою.Нужно ли вызывать UpdateResourceValues после изменения смарт‑фильтров? Да.
UpdateResourceValuesзаписывает изменённую коллекцию фильтров в ресурсы слоя Smart Object. Без этого новый фильтр не сохраняется при сохранении.
Получите бесплатную лицензию и узнайте больше
Оцените Aspose.PSD for .NET без ограничений, запросив временную лицензию:
Получить бесплатную временную лицензию
Дополнительные ресурсы для работы с PSD‑файлами в .NET:
- Документация Aspose.PSD for .NET
- Справочник API Aspose.PSD for .NET
- Манипулирование смарт‑фильтрами в Aspose.PSD for C#
- Бесплатные онлайн‑инструменты PSD
