فیلتر Displace یکی از مفیدترین ابزارهای اعوجاج در Photoshop است. این فیلتر پیکسلهای لایه را بر اساس مقادیر روشنایی یک نقشه جابجایی جداگانه تغییر شکل میدهد، که به طراحان امکان میدهد آثار هنری را دور تاوهای پارچه بپیچند، افکتهای موجدار اضافه کنند یا لوگوها را بر روی سطوح بافتدار قرار دهند. زمانی که این فیلتر بهعنوان یک smart filter اعمال میشود، تنظیمات آن داخل فایل PSD ذخیره میشود و بهصورت کامل قابل ویرایش باقی میماند. این مقاله نشان میدهد چگونه دادههای smart filter مربوط به Displace را در C# بخوانید و بنویسید. شما یک smart filter Displace را به لایهٔ Smart Object اضافه میکنید، مقیاس و گزینههای مدیریت لبه آن را پیکربندی میکنید، نقشه جابجایی را درونگذاری میکنید، فایل PSD را ذخیره میکنید و سپس تنظیمات فیلتر را میخوانید تا مسیر کامل را تأیید کنید — همه اینها بدون نصب Adobe Photoshop.
نکات کلیدی
- کلاس
DisplaceSmartFilter، که در Aspose.PSD for .NET 26.8 و نسخههای بعدی موجود است، فیلتر Displace فتوشاپ را به عنوان یک شیء .NET با نوع قوی ارائه میدهد. - مقیاس افقی و عمودی، روش جابجایی (
TileیاStretch) و مدیریت ناحیههای تعریفنشده (WrapAroundیاRepeatEdgePixels) همگی ویژگیهای ساده خواندنی/نوشتنی هستند. - نقشه جابجایی میتواند با ارسال مقدار
trueبه سازنده، در PSD خروجی جاسازی شود، که فایل را خودکفا و قابل حمل نگه میدارد. - پس از تغییر مجموعه فیلترها باید
SmartFilters.UpdateResourceValues()فراخوانی شود، در غیر این صورت تغییرات ذخیره نمیشوند. - همان API دادههای فیلتر را از فایلهای PSD موجود میخواند، که آن را برای اعتبارسنجی، حسابرسی و پردازش دستهای مناسب میسازد.
Why the Displace Smart Filter Matters
خطوط لولهٔ خودکارسازی طراحی اغلب نیاز دارند تا اثرات فتوشاپ را در مقیاس بزرگ بازتولید کنند. مثالهای معمول شامل تولید ماکاپهای محصول است که در آن طرح چاپی با چینوچروکهای یک تیشرت هماهنگ میشود، ایجاد انواع قالب برای تیمهای بازاریابی، یا بررسی کتابخانهای از قالبهای PSD برای تأیید اینکه هر فایل از تنظیمات یکسان فیلتر استفاده میکند.
انجام این کار بهصورت دستی در Photoshop مقیاسپذیر نیست و صافکردن اثر به پیکسلها قابلیت ویرایش آن را در آینده از بین میبرد. با خواندن و نوشتن دادههای Displace smart filter در C#، فیلتر را بهصورت غیر مخرب و قابل ویرایش در Photoshop نگه میدارید، در حالی که میتوانید آن را از طریق کد سمت سرور، کارهای پسزمینه یا ابزارهای دسکتاپ کنترل کنید.
استفاده از Aspose.PSD برای خواندن و نوشتن دادههای فیلتر هوشمند Displace
Aspose.PSD for .NET به توسعهدهندگان C# امکان میدهد تا دادههای فیلتر هوشمند Displace را مستقیماً از طریق کلاس DisplaceSmartFilter بخوانند و بنویسند.
شروع کار
پکیج Aspose.PSD NuGet package (نسخه 26.8 یا بالاتر) را از کنسول مدیر بسته نصب کنید:
Install-Package Aspore.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 فتوشاپ است |
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);
}
Explanation
- Loading the PSD –
Image.LoadیکImageعمومی را برمیگرداند که بهPsdImageتبدیل میشود تا به ویژگیهای خاص PSD مانند لایهها و فیلترهای هوشمند دسترسی پیدا کند. - Finding the Smart Object layer –
OfType<SmartObjectLayer>()اولین لایه Smart Object را انتخاب میکند و در صورت عدم وجود، با پیغام واضحی شکست میخورد. این روش نسبت به دسترسی مستقیم بهLayersایمنتر است، زیرا ترتیب لایهها بین فایلها متفاوت است. - Creating the filter – سازنده
DisplaceSmartFilter(string, bool)مسیر نقشه جابجایی و یک پرچم را میگیرد که کنترل میکند آیا نقشه جاسازی شود یا نه. ارسالtrueباعث میشود PSD خروجی خودکفا باشد. - Configuring the filter –
HorizontalScaleوVerticalScaleشدت جابجایی را تنظیم میکنند.DisplacementMethod.Tileنقشه را در سراسر لایه تکرار میکند، در حالی کهStretchآن را برای پر کردن مقیاس میکند.UndefinedAreas.WrapAroundپیکسلهای جابجا شده خارج از بوم را با محتوای لبه مخالف پر میکند؛RepeatEdgePixelsبه جای آن رنگهای لبه را گسترش میدهد. - Updating the collection –
SmartFilters.Filtersبه صورت آرایه در دسترس است. کپی آن به یکList<SmartFilter>، افزودن فیلتر جدید و اختصاصToArray()مجدد، هر فیلتر هوشمندی که قبلاً بر روی لایه وجود داشته را حفظ میکند. - Persisting the changes –
UpdateResourceValues()مجموعه فیلترها را در منابع PSD لایه مینویسد. اگر این فراخوانی را نادیده بگیرید، فیلتر جدید هنگام ذخیره از دست خواهد رفت. - Saving –
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مقادیر ذخیرهشده را با مقادیر اصلی مقایسه میکند و در صورت عدم تطابق، با پیام توصیفی خطا میاندازد.
Conclusion
با کلاس DisplaceSmartFilter در Aspose.PSD for .NET، توسعهدهندگان C# میتوانند فیلترهای هوشمند Displace فتوشاپ را بهصورت کامل در کد اضافه، پیکربندی، ذخیره و دوباره بخوانند. این فیلتر بهصورت غیر مخرب و قابل ویرایش در فتوشاپ باقی میماند، نقشه جابجایی میتواند داخل PSD حرکت کند و همان API از اعتبارسنجی دورگرد (round‑trip) پشتیبانی میکند. این امر ساخت مولدهای موکاپ، خطوط لوله قالب و ابزارهای بررسی PSD بر پایه .NET را ساده میسازد.
پرسشهای متداول
کدام نسخه از Aspose.PSD for .NET از فیلتر هوشمند Displace پشتیبانی میکند؟ خواندن و نوشتن دادههای فیلتر هوشمند Displace در Aspose.PSD for .NET نسخه 26.8 معرفی شد. برای دسترسی به کلاس
DisplaceSmartFilterاز نسخه 26.8 یا بالاتر استفاده کنید.آیا میتوانم 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 مستندات
- Aspose.PSD for .NET مرجع API
- دستکاری فیلتر هوشمند در Aspose.PSD for C#
- ابزارهای رایگان آنلاین PSD
