فیلتر 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 در یک نگاه

PropertyTypePurpose
HorizontalScaledoubleمقیاس جابجایی افقی، همان‌طور که در دیالوگ Displace فتوشاپ است
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);
}

Explanation

  1. Loading the PSD – Image.Load یک Image عمومی را برمی‌گرداند که به PsdImage تبدیل می‌شود تا به ویژگی‌های خاص PSD مانند لایه‌ها و فیلترهای هوشمند دسترسی پیدا کند.
  2. Finding the Smart Object layer – OfType<SmartObjectLayer>() اولین لایه Smart Object را انتخاب می‌کند و در صورت عدم وجود، با پیغام واضحی شکست می‌خورد. این روش نسبت به دسترسی مستقیم به Layers ایمن‌تر است، زیرا ترتیب لایه‌ها بین فایل‌ها متفاوت است.
  3. Creating the filter – سازنده DisplaceSmartFilter(string, bool) مسیر نقشه جابجایی و یک پرچم را می‌گیرد که کنترل می‌کند آیا نقشه جاسازی شود یا نه. ارسال true باعث می‌شود PSD خروجی خودکفا باشد.
  4. Configuring the filter – HorizontalScale و VerticalScale شدت جابجایی را تنظیم می‌کنند. DisplacementMethod.Tile نقشه را در سراسر لایه تکرار می‌کند، در حالی که Stretch آن را برای پر کردن مقیاس می‌کند. UndefinedAreas.WrapAround پیکسل‌های جابجا شده خارج از بوم را با محتوای لبه مخالف پر می‌کند؛ RepeatEdgePixels به جای آن رنگ‌های لبه را گسترش می‌دهد.
  5. Updating the collection – SmartFilters.Filters به صورت آرایه در دسترس است. کپی آن به یک List<SmartFilter>، افزودن فیلتر جدید و اختصاص ToArray() مجدد، هر فیلتر هوشمندی که قبلاً بر روی لایه وجود داشته را حفظ می‌کند.
  6. Persisting the changes – UpdateResourceValues() مجموعه فیلترها را در منابع PSD لایه می‌نویسد. اگر این فراخوانی را نادیده بگیرید، فیلتر جدید هنگام ذخیره از دست خواهد رفت.
  7. 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}.");
    }
}

توضیح

  1. بارگذاری مجدد فایل – Image.Load فایل PSD ذخیره‌شده در مرحله قبلی را باز می‌کند.
  2. یافتن لایه Smart Object – جستجوی مبتنی بر نوع یکسان، مراحل خواندن و نوشتن را سازگار نگه می‌دارد.
  3. یافتن فیلتر بر اساس نوع – OfType<DisplaceSmartFilter>().LastOrDefault() آخرین فیلتر Displace اضافه‌شده را برمی‌گرداند و هرگز تبدیل نامعتبر تولید نمی‌کند. این روش نسبت به خواندن آخرین عنصر آرایه و تبدیل با as که به‌صورت ساکن null برمی‌گرداند اگر فیلتر متفاوتی در آن موقعیت باشد، قابل اطمینان‌تر است.
  4. خواندن ویژگی‌ها – تمام تنظیمات فیلتر به‌صورت ویژگی‌های تایپ‌شده در دسترس هستند، بنابراین می‌توان آن‌ها را لاگ کرد، مقایسه کرد یا به گزارش صادر نمود.
  5. اعتبارسنجی – ابزار کمکی AssertAreEqual مقادیر ذخیره‌شده را با مقادیر اصلی مقایسه می‌کند و در صورت عدم تطابق، با پیام توصیفی خطا می‌اندازد.

Conclusion

با کلاس DisplaceSmartFilter در Aspose.PSD for .NET، توسعه‌دهندگان C# می‌توانند فیلترهای هوشمند Displace فتوشاپ را به‌صورت کامل در کد اضافه، پیکربندی، ذخیره و دوباره بخوانند. این فیلتر به‌صورت غیر مخرب و قابل ویرایش در فتوشاپ باقی می‌ماند، نقشه جابجایی می‌تواند داخل PSD حرکت کند و همان API از اعتبارسنجی دورگرد (round‑trip) پشتیبانی می‌کند. این امر ساخت مولدهای موکاپ، خطوط لوله قالب و ابزارهای بررسی PSD بر پایه .NET را ساده می‌سازد.

پرسش‌های متداول

  1. کدام نسخه از Aspose.PSD for .NET از فیلتر هوشمند Displace پشتیبانی می‌کند؟ خواندن و نوشتن داده‌های فیلتر هوشمند Displace در Aspose.PSD for .NET نسخه 26.8 معرفی شد. برای دسترسی به کلاس DisplaceSmartFilter از نسخه 26.8 یا بالاتر استفاده کنید.

  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:

بیشتر بخوانید