شیء‌های هوشمند و اثرات لایه‌ای آن‌ها هنگام پردازش فایل در کد از بین می‌روند. توسعه‌دهندگانی که با فایل‌های Photoshop کار می‌کنند اغلب با همین مشکل مواجه می‌شوند. این راهنما نشان می‌دهد چگونه با استفاده از C# شیء‌های هوشمند و اثرات را در فایل‌های PSD مدیریت کنید. شما یک PSD را بدون از دست دادن اثرات آن بارگذاری می‌کنید، محتوای داخلی یک شیء هوشمند را استخراج می‌کنید، و شیء هوشمند را به عنوان یک PNG مستقل، همراه با تمام اثرات، ذخیره می‌کنید.

آبجکت‌های هوشمند محتوای تصویری جاسازی‌شده یا پیوندشده‌ای هستند که فتوشاپ به شما اجازه می‌دهد به‌صورت غیر مخرب داخل یک لایه ویرایش کنید. وقتی یک PSD حاوی آبجکت‌های هوشمند با یک کتابخانه تصویری عمومی باز می‌شود، کتابخانه معمولاً محتوای خود آبجکت هوشمند و هر اثر لایه‌ای — مانند سایه‌های افتاده، تابش‌ها یا برجستگی‌ها — اعمال‌شده بر روی آن را حذف می‌کند. نتیجه یک تصویر رستر مسطح با جزئیات بصری گمشده است، تجربه‌ای ناقص برای هر گردش کاری که به دقت بصری دقیق وابسته است، ایجاد می‌کند. Aspose.PSD for .NET یک کلاس اختصاصی SmartObjectLayer و یک پرچم PsdLoadOptions.LoadEffectsResource ارائه می‌دهد که این اثرها را در دسترس نگه می‌دارند، به طوری که بتوانید به‌صورت برنامه‌نویسی محتویات آبجکت هوشمند را استخراج کرده و رندرینگ وفادار با اثرات گنجانده‌شده را بدون از دست دادن هرگونه استایل صادر کنید.

چرا مدیریت اشیاء هوشمند و افکت‌ها در فایل‌های PSD?

حفظ محتوای اشیاء هوشمند و افکت‌ها برای چندین سناریوی واقعی اهمیت دارد. خطوط لوله طراحی گرافیک اغلب نیاز دارند یک شیء هوشمند را از یک قالب به عنوان یک دارایی مستقل برای استفاده در وب یا موبایل استخراج کنند. اگر افکت‌های آن لایه در حین تبدیل حذف شوند، طراحان مجبور می‌شوند به‌صورت دستی آن‌ها را دوباره اعمال کنند که هدف خودکارسازی را خنثی می‌کند. سیستم‌های مدیریت محتوا که فایل‌های PSD را برای تولید پیش‌نمایش می‌گیرند نیز به نمایش دقیق هر لایه، شامل افکت‌ها، نیاز دارند.

Aspose.PSD به شما کنترل صریحی بر دو عملیات مرتبط اما متفاوت می‌دهد: خواندن منبع تعبیه‌شدهٔ شی هوشمند (تصویری که در ابتدا قرار داده شده بود) و رندر کردن شی هوشمند همان‌طور که بر روی بوم ظاهر می‌شود، با اعمال هرگونه افکت لایه. نگه داشتن این دو به‌صورت جداگانه مهم است — ترکیب آن‌ها رایج‌ترین اشتباه هنگام کار با این بخش از API است، و این آموزش هر دو را به‌درستی مرور می‌کند.

استفاده از Aspose.PSD برای مدیریت اشیاء هوشمند و افکت‌ها در فایل‌های PSD

برای شروع کار با اشیاء هوشمند، باید کتابخانه Aspose.PSD را در پروژه .NET خود نصب کنید. ساده‌ترین روش از طریق NuGet است:

Install-Package Aspose.PSD

پس از ارجاع به بسته، می‌توانید مستندات کامل API را در صفحه محصول Aspose.PSD بررسی کنید. کلاس‌های کلیدی مورد استفاده در این آموزش عبارتند از:

  • PsdLoadOptions (namespace Aspose.PSD.ImageLoadOptions) — نحوه تجزیه یک فایل PSD را کنترل می‌کند، از جمله اینکه آیا منابع اثر لایه بارگذاری شوند یا نه.
  • Image.Load — متد کارخانه‌ای ایستا که یک نمونه Image را از مسیر فایل و گزینه‌های بارگذاری ایجاد می‌کند.
  • SmartObjectLayer (namespace Aspose.PSD.FileFormats.Psd.Layers.SmartObjects) — یک شی هوشمند داخل فایل PSD را نشان می‌دهد. متدهای LoadContents و ExportContents را برای خواندن محتوای جاسازی‌شده آن در دسترس می‌گذارد.
  • PsdImage (namespace Aspose.PSD.FileFormats.Psd) — نوع تصویر واقعی برای فایل‌های PSD.
  • Layer.IsVisible (namespace Aspose.PSD.FileFormats.Psd.Layers) — قابلیت نمایش لایه را تغییر می‌دهد، که روشی برای جداسازی یک لایه قبل از ذخیره‌سازی است.
  • PngOptions and PngColorType — صادرات PNG را پیکربندی می‌کند، به‌ویژه زمانی که به خروجی شفاف نیاز دارید.

بخش‌های زیر یک مثال کامل، انتها به انتها را که هر مرحله را نشان می‌دهد، مرور می‌کنند.

مدیریت اشیاء هوشمند و افکت‌ها در فایل‌های PSD: راهنمای گام به گام

در ادامه یک راهنمای عملی آورده شده است که یک شی هوشمند را در یک فایل PSD پیدا می‌کند، محتوای تعبیه‌شدهٔ آن را استخراج می‌نماید و لایهٔ شی هوشمند را به‌صورت جداگانه — به همراه افکت‌های آن — به‌صورت PNG رندر می‌کند.

1. آماده‌سازی مسیرهای فایل و گزینه‌های بارگذاری

فایل PSD ورودی و مسیرهای خروجی PNG را تعریف کنید. همچنین باید بارگذاری منبع اثر را با تنظیم LoadEffectsResource به true فعال کنید، تا هر اثر لایه‌ای روی شی هوشمند در هنگام ذخیره‌سازی به تصویر نهایی ترکیب‌شده رندر شود.

string srcFile = Path.Combine(baseFolder, "sample-with-smart-object.psd");
string contentFile = Path.Combine(outputFolder, "smart-object-content.png");
string renderedFile = Path.Combine(outputFolder, "smart-object-rendered.png");

PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
psdLoadOptions.LoadEffectsResource = true;

2. بارگذاری تصویر PSD با منابع افکت

Image.Load فایل را با استفاده از گزینه‌های قبلاً پیکربندی‌شده می‌خواند. تبدیل به PsdImage دسترسی به اعضای خاص PSD مانند مجموعه لایه‌ها را فراهم می‌کند.

using (PsdImage psdImage = (PsdImage)Image.Load(srcFile, psdLoadOptions))
{
    // Subsequent code works inside this using block
}

دستور using اطمینان می‌دهد که منابع غیرمدیریت‌شده به‌سرعت آزاد شوند، که به‌ویژه برای فایل‌های بزرگ PSD مهم است.

3. یافتن SmartObjectLayer

یک فایل PSD می‌تواند انواع لایه‌های متعددی داشته باشد، بنابراین به‌جای فرض کردن یک ایندکس ثابت، هر کدام را بررسی کنید. الگوی is زمانی که لایه SmartObjectLayer نیست، null برمی‌گرداند (و لایه را نادیده می‌گیرد).

SmartObjectLayer smartObject = null;
foreach (Layer layer in psdImage.Layers)
{
    if (layer is SmartObjectLayer soLayer)
    {
        smartObject = soLayer;
        break;
    }
}

if (smartObject == null)
{
    Console.WriteLine("No smart object layer found in this PSD.");
    return;
}

4. صادرات محتوای توکار شی هوشمند

هر شیء هوشمند محتویات تصویر جاسازی‌شده یا پیوندشده خود را ذخیره می‌کند — فایلی که در ابتدا در آن قرار داده شده بود. فراخوانی LoadContents آن محتوا را به عنوان یک Image برمی‌گرداند، که نمونه‌های مرجع API آن را به RasterImage تبدیل می‌کنند. ذخیره‌سازی آن با PngOptions خروجی PNG را تضمین می‌کند، صرف‌نظر از این‌که محتوا در ابتدا با چه فرمت‌ایی جاسازی شده بود.

using (RasterImage innerContent = (RasterImage)smartObject.LoadContents(null))
{
    innerContent.Save(contentFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
}

فایل حاصل (smart-object-content.png) تصویر منبع خود شی هوشمند است، پیش از اینکه هر اثر لایه‌ای از PSD خارجی اعمال شود. اگر فقط به محتوا در قالب اصلی آن نیاز دارید، smartObject.ExportContents(path) همان خروجی را در یک فراخوانی انجام می‌دهد و آن را با پسوند قالب اصلی می‌نویسد.

5. رندر لایه شی هوشمند با اعمال افکت‌های آن

افکت‌های لایه — سایه‌های افتاده، درخشندگی‌ها، برجستگی‌ها — متعلق به سند خارجی هستند، نه به محتوای خود شی هوشمند، بنابراین LoadContents هرگز آن‌ها را شامل نمی‌شود. برای دریافت یک تصویر صاف از شی هوشمند همان‌گونه که بر روی بوم ظاهر می‌شود، با افکت‌ها شامل، تمام لایه‌های دیگر را مخفی کنید و کل PsdImage را ذخیره کنید. چون LoadEffectsResource هنگام بارگذاری روی true تنظیم شده بود، Aspose.PSD افکت‌های پشتیبانی‌شده را در آن تصویر نهایی ترکیب‌شده رندر می‌کند.

foreach (Layer layer in psdImage.Layers)
{
    if (!ReferenceEquals(layer, smartObject))
    {
        layer.IsVisible = false;
    }
}

psdImage.Save(renderedFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });

فایل حاصل (smart-object-rendered.png) فقط شی هوشمند را نشان می‌دهد، به‌طوری که اثرات آن دقیقاً همان‌طور که فتوشاپ نمایش می‌دهد، رندر شده‌اند.

6. لیست کامل کد

مثال زیر هر دو مرحله را در یک برنامهٔ خودکفا ترکیب می‌کند: شی هوشمند را پیدا می‌کند، محتوای خود را صادر می‌نماید، سپس لایه را که اثرات اعمال شده‌اند، جدا و رندر می‌کند.

using System;
using System.IO;
using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;
using Aspose.PSD.FileFormats.Png;
using Aspose.PSD.ImageLoadOptions;
using Aspose.PSD.ImageOptions;

class SmartObjectHandler
{
    static void Main()
    {
        string baseFolder = @"C:\Input";   // folder containing the source PSD
        string outputFolder = @"C:\Output"; // folder for the PNG results

string srcFile = Path.Combine(baseFolder, "sample-with-smart-object.psd");
        string contentFile = Path.Combine(outputFolder, "smart-object-content.png");
        string renderedFile = Path.Combine(outputFolder, "smart-object-rendered.png");

Directory.CreateDirectory(outputFolder);

// Enable loading of effect resources so that layer effects are rendered on save
        PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
        psdLoadOptions.LoadEffectsResource = true;

using (PsdImage psdImage = (PsdImage)Image.Load(srcFile, psdLoadOptions))
        {
            // Find the first smart object layer
            SmartObjectLayer smartObject = null;
            foreach (Layer layer in psdImage.Layers)
            {
                if (layer is SmartObjectLayer soLayer)
                {
                    smartObject = soLayer;
                    break;
                }
            }

if (smartObject == null)
            {
                Console.WriteLine("No smart object layer found in this PSD.");
                return;
            }

// 1. Export the smart object's own embedded content (before outer effects)
            using (RasterImage innerContent = (RasterImage)smartObject.LoadContents(null))
            {
                innerContent.Save(contentFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
            }
            Console.WriteLine($"Smart object content saved to {contentFile}");

// 2. Isolate the smart object layer and save the document to bake in its effects
            foreach (Layer layer in psdImage.Layers)
            {
                if (!ReferenceEquals(layer, smartObject))
                {
                    layer.IsVisible = false;
                }
            }

psdImage.Save(renderedFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
            Console.WriteLine($"Smart object rendered with effects saved to {renderedFile}");
        }

Console.WriteLine("Smart object processing completed successfully.");
    }
}

کد چه کاری انجام می‌دهد، گام به گام

  1. تعریف مسیرهاsrcFile به فایل PSD منبع اشاره می‌کند؛ contentFile و renderedFile دو خروجی PNG هستند.
  2. پیکربندی گزینه‌های بارگذاریLoadEffectsResource = true به Aspose.PSD می‌گوید که منابع اثر لایه را بخواند تا هنگام ذخیره‌سازی رندر شوند.
  3. بارگذاری PSDImage.Load یک Image عمومی برمی‌گرداند که به PsdImage تبدیل می‌شود تا از ویژگی‌های خاص PSD استفاده شود.
  4. یافتن شی هوشمند — کد به جای فرض یک ایندکس ثابت، هر لایه را با is SmartObjectLayer بررسی می‌کند.
  5. صادرات محتوای توکارLoadContents تصویر منبع شی هوشمند را برمی‌گرداند که به RasterImage تبدیل شده و به صورت PNG ذخیره می‌شود.
  6. ایزوله‌سازی و رندر — با مخفی کردن تمام لایه‌های دیگر و ذخیره کل PsdImage، یک PNG صاف فقط از شی هوشمند تولید می‌شود که اثرات آن درون‌ریزی شده‌اند.
  7. پاک‌سازی منابع — بلوک‌های using به محض اتمام کار، PsdImage خارجی و تصویر محتوای داخلی را آزاد می‌کنند.

دریافت یک لایسنس رایگان

می‌توانید یک مجوز موقت رایگان برای اهداف ارزیابی از صفحهٔ مجوز رایگان Aspose دریافت کنید. این مجوز علامت آب‌نمای ارزیابی را حذف می‌کند و به شما امکان می‌دهد جریان کار smart-object را در محیط خود آزمایش کنید.

منابع اضافی رایگان

نتیجه‌گیری

دستکاری اشیاء هوشمند و اثرات آنها در فایل‌های PSD دیگر نیازی به مرحله دستی Photoshop ندارد. با استفاده از Aspose.PSD’s SmartObjectLayer، PsdLoadOptions.LoadEffectsResource و Layer.IsVisible، توسعه‌دهندگان .NET می‌توانند به‌صورت برنامه‌نویسی محتویات یک شیء هوشمند را استخراج کرده و به‌صورت جداگانه با حفظ اثرات لایه آن رندر کنند، سپس نتیجه را در یک خط لوله خودکار ادغام کنند. کد نمونه یک جریان کاری کامل را نشان می‌دهد که می‌توانید برای پردازش دسته‌ای، ابزارهای UI یا سرویس‌های تصویر سمت سرور تنظیم کنید.

سوالات متداول

  1. SmartObjectLayer در Aspose.PSD چیست؟ SmartObjectLayer نمایانگر یک لایه شی هوشمند داخل یک فایل PSD است. این لایه محتوای تصویری جاسازی‌شده یا پیوندشده خود را دارد که می‌توانید آن را به‌صورت مستقل از بقیه سند بارگذاری، جایگزین یا صادر کنید.

  2. آیا برای حفظ افکت‌ها هنگام بارگذاری PSD نیاز به فعال‌سازی گزینه‌ای دارم؟
    بله — set PsdLoadOptions.LoadEffectsResource to true (namespace Aspose.PSD.ImageLoadOptions) به‌طوری که افکت‌های لایه پشتیبانی‌شده، مانند سایه‌های افتاده و درخشندگی‌ها، در تصویر نهایی ترکیب‌شده هنگام ذخیره‌سازی رندر شوند.

  3. آیا می‌توانم یک شی هوشمند را به‌صورت برنامه‌نویسی به لایهٔ رستر معمولی تبدیل کنم؟ SmartObjectProvider.ConvertToSmartObject در واقع کار برعکس را انجام می‌دهد — آن لایه‌های معمولی را در یک شی هوشمند توکار جدید می‌پیچد. برای دریافت یک PNG صاف از یک شی هوشمند با اعمال افکت‌های آن، Layer.IsVisible را برای لایه‌های دیگر به false تنظیم کنید و PsdImage حاوی آن را ذخیره کنید.

  4. آیا امکان پردازش چندین شی هوشمند در یک فایل PSD وجود دارد؟ بله — تکرار کنید روی psdImage.Layers، هر لایه را با الگوی is SmartObjectLayer بررسی کنید، و مراحل استخراج و رندر را برای هر یک که پیدا می‌کنید تکرار کنید.

  5. چه فرمت تصویری برای حفظ شفافیت هنگام ذخیره یک شی هوشمند به عنوان PNG توصیه می‌شود؟ از PngOptions با ColorType = PngColorType.TruecolorWithAlpha استفاده کنید تا اطلاعات کامل کانال آلفا حفظ شود.

  6. آیا برای اجرای کد نمونه در محیط تولید به مجوز نیاز دارم؟ یک مجوز موقت رایگان برای ارزیابی کافی است، اگرچه خروجی بدون آن دارای واترمارک می‌شود؛ استفاده در تولید نیاز به یک مجوز کامل Aspose.PSD دارد.

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