Фільтр 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 у стислому огляді
| Властивість | Тип | Призначення |
|---|---|---|
HorizontalScale | double | Горизонтальна шкала зсуву, як у діалоговому вікні Displace Photoshop |
VerticalScale | double | Вертикальна шкала зсуву |
DisplacementMethod | DisplacementMethod | Tile повторює карту; Stretch змінює розмір карти, щоб вона відповідала шару |
UndefinedAreas | UndefinedAreas | WrapAround або RepeatEdgePixels для пікселів, зміщених за межі шару |
IsDisplacementMapEmbedded | bool | Вказує, чи карта вбудована у PSD |
DisplaceMapData | — | Вбудовані дані карти зсуву |
DisplacementMapPath | string | Шлях до карти зсуву |
Як додати 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);
}
Пояснення
- Завантаження 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 smart filters повністю в коді. Фільтр залишається недеструктивним і редагованим у Photoshop, карта зміщення може перебувати всередині PSD, а той самий API підтримує кругову перевірку. Це спрощує створення генераторів макетів, конвеєрів шаблонів та інструментів аудиту 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 Documentation
- Aspose.PSD for .NET довідник API
- Маніпулювання смарт-фільтрами в Aspose.PSD для C#
- Безкоштовні онлайн інструменти PSD
