Chytré objekty a jejich efekty vrstev se při zpracování souboru v kódu ztratí. Vývojáři pracující se soubory Photoshopu často narazí na tento stejný problém. Tento průvodce ukazuje, jak zacházet s chytrými objekty a efekty v souborech PSD pomocí C#. Načtete PSD bez ztráty jeho efektů, vytáhnete obsah chytrého objektu a uložíte chytrý objekt jako samostatný PNG, včetně všech efektů.

Smart objekty jsou vložený nebo propojený obrazový obsah, který Photoshop umožňuje neinvazivně upravovat uvnitř vrstvy. Když je PSD obsahující smart objekty otevřen pomocí obecné knihovny obrázků, knihovna obvykle zahodí samotný obsah smart objektu a jakékoli efekty vrstvy — jako jsou stíny, záře nebo zkosení — aplikované na něj. Výsledkem je zploštělý rastrový obrázek s chybějícími vizuálními detaily, což vede k narušenému zážitku pro jakýkoli pracovní postup, který se spoléhá na přesnou vizuální věrnost. Aspose.PSD for .NET poskytuje dedikovanou třídu SmartObjectLayer a příznak PsdLoadOptions.LoadEffectsResource, které udržují tyto efekty dostupné, takže můžete programově extrahovat obsah smart objektu a exportovat věrné vykreslení zahrnující efekty, aniž byste ztratili jakékoli stylování.

Proč zpracovávat Smart Objects a efekty v souborech PSD

Zachování obsahu a efektů smart objektu je důležité pro několik reálných scénářů. Grafické designové pipeline často potřebují vytáhnout jediný smart objekt z šablony jako samostatný asset pro web nebo mobilní použití. Pokud jsou během konverze ztraceny efekty na této vrstvě, designéři je musí ručně znovu aplikovat, což ruší smysl automatizace. Systémy pro správu obsahu, které načítají soubory PSD pro generování náhledů, také potřebují věrné zobrazení každé vrstvy, včetně efektů.

Aspose.PSD vám poskytuje explicitní kontrolu nad dvěma souvisejícími, ale odlišnými operacemi: čtením vlastního vloženého zdroje inteligentního objektu (obrázku, který byl původně umístěn) a vykreslením inteligentního objektu tak, jak se zobrazuje na plátně, s aplikovanými efekty vrstev. Udržení těchto dvou operací oddělených je důležité – sloučení je nejčastější chybou při práci s touto částí API a tento tutoriál vás provede oběma správně.

Použití Aspose.PSD pro zpracování Smart Objects a efektů v souborech PSD

Chcete‑li začít pracovat se smart objekty, potřebujete mít v projektu .NET nainstalovanou knihovnu Aspose.PSD. Nejjednodušší způsob je přes NuGet:

Install-Package Aspose.PSD

Jakmile je balíček odkazován, můžete prozkoumat úplnou dokumentaci API na Aspose.PSD produktová stránka. Klíčové třídy použité v tomto tutoriálu jsou:

  • PsdLoadOptions (namespace Aspose.PSD.ImageLoadOptions) — řídí, jak je soubor PSD parsován, včetně toho, zda načíst zdroje efektů vrstev.
  • Image.Load — statická tovární metoda, která vytvoří instanci Image ze souborové cesty a možností načítání.
  • SmartObjectLayer (namespace Aspose.PSD.FileFormats.Psd.Layers.SmartObjects) — reprezentuje inteligentní objekt uvnitř souboru PSD. Poskytuje LoadContents a ExportContents pro čtení jeho vloženého obsahu.
  • PsdImage (namespace Aspose.PSD.FileFormats.Psd) — konkrétní typ obrazu pro soubory PSD.
  • Layer.IsVisible (namespace Aspose.PSD.FileFormats.Psd.Layers) — přepíná viditelnost vrstvy, což je způsob, jak izolovat jednu vrstvu před uložením.
  • PngOptions a PngColorType — konfiguruje export PNG, zejména když potřebujete průhledný výstup.

Následující sekce vás provedou kompletním, end-to-end příkladem, který ukazuje každý krok.

Zpracování inteligentních objektů a efektů v souborech PSD: Průvodce krok za krokem

Níže je praktický průvodce, který najde inteligentní objekt v souboru PSD, exportuje jeho vlastní vložený obsah a samostatně vykreslí vrstvu inteligentního objektu — s jeho efekty — jako PNG.

1. Připravte cesty k souborům a možnosti načtení

Definujte vstupní soubor PSD a cílové umístění výstupního PNG. Také musíte povolit načítání zdrojů efektů nastavením LoadEffectsResource na true, aby byly všechny efekty vrstev na chytrém objektu vykresleny do finální sloučené obrázku při uložení.

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. Načíst PSD obrázek s prostředky efektů

Image.Load načte soubor pomocí dříve nakonfigurovaných možností. Přetypování na PsdImage poskytuje přístup k členům specifickým pro PSD, jako je kolekce vrstev.

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

Příkaz using zajišťuje, že neřízené prostředky jsou uvolněny okamžitě, což je zvláště důležité pro velké soubory PSD.

3. Najděte vrstvu SmartObjectLayer

PSD může obsahovat mnoho typů vrstev, takže je třeba zkontrolovat každou spíše než předpokládat pevný index. Vzor is vrací null (a přeskočí vrstvu), když to není SmartObjectLayer.

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. Exportovat vlastní vložený obsah objektu Smart Object

Každý inteligentní objekt ukládá svůj vlastní vložený nebo odkazovaný obrazový obsah — soubor, který byl do něj původně vložen. Volání LoadContents vrátí tento obsah jako Image, což příklady v referenční dokumentaci API převádějí na RasterImage. Uložení pomocí PngOptions zaručuje výstup ve formátu PNG bez ohledu na to, v jakém formátu byl obsah původně vložen.

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

Výsledný soubor (smart-object-content.png) je vlastní zdrojový obrázek smart objektu, před tím, než jsou na něj aplikovány jakékoli efekty vrstev z vnějšího PSD. Pokud potřebujete obsah pouze v jeho původním formátu, smartObject.ExportContents(path) provede stejný export v jednom volání a zapíše jej s příponou původního formátu.

5. Vykreslete vrstvu Smart Object s aplikovanými efekty

Vrstvy efektů — stíny, záře, zkosení — patří k vnějšímu dokumentu, nikoli k vlastnímu obsahu inteligentního objektu, takže LoadContents je nikdy nezahrnuje. Chcete-li získat plochý obrázek inteligentního objektu tak, jak se zobrazuje na plátně, včetně efektů, skryjte všechny ostatní vrstvy a uložte celý PsdImage. Protože při načítání bylo LoadEffectsResource nastaveno na true, Aspose.PSD vykreslí podporované efekty do finálního sloučeného obrázku.

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

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

Výsledný soubor (smart-object-rendered.png) zobrazuje pouze inteligentní objekt, přičemž jeho efekty jsou vykresleny přesně tak, jak by je zobrazoval Photoshop.

6. Úplný výpis kódu

Následující příklad spojuje oba kroky do jednoho samostatného programu: najde inteligentní objekt, exportuje jeho vlastní obsah a poté izoluje a vykreslí vrstvu s aplikovanými efekty.

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.");
    }
}

Co kód dělá, krok za krokem

  1. Definovat cestysrcFile ukazuje na zdrojový PSD; contentFile a renderedFile jsou dva výstupní PNG soubory.
  2. Konfigurovat možnosti načítáníLoadEffectsResource = true říká Aspose.PSD, aby načetl zdroje efektů vrstev, aby mohly být při uložení vykresleny.
  3. Načíst PSDImage.Load vrací obecný Image, který je přetypován na PsdImage pro funkce specifické pro PSD.
  4. Najít inteligentní objekt — kód kontroluje každou vrstvu pomocí is SmartObjectLayer místo předpokládání pevného indexu.
  5. Exportovat vložený obsahLoadContents vrací vlastní zdrojový obrázek inteligentního objektu, který je přetypován na RasterImage a uložen jako PNG.
  6. Izolovat a renderovat — skrytím všech ostatních vrstev a uložením celého PsdImage vznikne plochý PNG pouze inteligentního objektu, s jeho efekty zapracovanými.
  7. Uvolnění prostředkůusing bloky uvolní vnější PsdImage a vnitřní obrázek obsahu, jakmile jsou s nimi hotové.

Získejte bezplatnou licenci

Dočasnou bezplatnou licenci pro evaluační účely můžete získat na stránka s bezplatnou licencí Aspose. Licence odstraňuje evaluační vodoznak a umožňuje vám testovat workflow s inteligentními objekty ve vašem vlastním prostředí.

Bezplatné další zdroje

Závěr

Zpracování inteligentních objektů a jejich efektů v souborech PSD již nevyžaduje ruční krok v Photoshopu. Pomocí Aspose.PSD’s SmartObjectLayer, PsdLoadOptions.LoadEffectsResource a Layer.IsVisible mohou vývojáři .NET programově extrahovat vlastní obsah inteligentního objektu a samostatně jej vykreslit s neporušenými efekty vrstvy, poté výsledek integrovat do automatizovaného pipeline. Ukázkový kód demonstruje kompletní workflow, který můžete přizpůsobit pro dávkové zpracování, UI nástroje nebo serverové obrazové služby.

FAQs

  1. Co je SmartObjectLayer v Aspose.PSD? SmartObjectLayer představuje vrstvu chytrého objektu uvnitř souboru PSD. Obsahuje vlastní vložený nebo propojený obrazový obsah, který můžete načíst, nahradit nebo exportovat nezávisle na zbytku dokumentu.

  2. Musím povolit nějakou volbu, aby se zachovaly efekty při načítání PSD? Ano — nastavte PsdLoadOptions.LoadEffectsResource na true (namespace Aspose.PSD.ImageLoadOptions), aby se podporované efekty vrstev, jako jsou stíny a záře, vykreslily do finálního sloučeného obrázku při uložení.

  3. Mohu programově převést inteligentní objekt na běžnou rastrovou vrstvu? SmartObjectProvider.ConvertToSmartObject ve skutečnosti dělá opak — zabaluje běžné vrstvy do nového vloženého inteligentního objektu. Chcete-li získat plochý PNG inteligentního objektu s aplikovanými efekty, nastavte Layer.IsVisible na false u ostatních vrstev a uložte obsahující PsdImage.

  4. Je možné zpracovat více smart objektů ve stejném PSD? Yes — iterate through psdImage.Layers, check each layer with the is SmartObjectLayer pattern, and repeat the extract-and-render steps for each one you find.

  5. Jaký formát obrazu se doporučuje pro zachování průhlednosti při ukládání inteligentního objektu jako PNG? Použijte PngOptions s ColorType = PngColorType.TruecolorWithAlpha, abyste zachovali úplné informace o alfa kanálu.

  6. Potřebuji licenci pro spuštění ukázkového kódu v produkci? Dočasná bezplatná licence stačí pro vyhodnocení, i když výstup bez ní obsahuje vodoznak; pro produkční použití je vyžadována plná licence Aspose.PSD.

Číst dál