スマートオブジェクトとそのレイヤー効果は、コードでファイルを処理すると失われてしまいます。Photoshop ファイルを扱う開発者はこの問題に頻繁に直面します。このガイドでは、C# を使用して PSD ファイル内のスマートオブジェクトと効果を扱う方法を示します。効果を失わずに PSD を読み込み、スマートオブジェクトのコンテンツを抽出し、効果をすべて含んだスタンドアロン PNG としてスマートオブジェクトを保存します。

スマートオブジェクトは、Photoshop がレイヤー内で非破壊的に編集できるように埋め込みまたはリンクされた画像コンテンツです。スマートオブジェクトを含む PSD を汎用画像ライブラリで開くと、ライブラリは通常、スマートオブジェクト自体のコンテンツと、その上に適用されたドロップシャドウ、グロー、ベベルなどのレイヤー効果を破棄します。その結果、視覚的な詳細が欠けたフラット化されたラスタ画像となり、正確なビジュアル忠実度に依存するワークフローにとって壊れた体験になります。Aspose.PSD for .NET は、専用の SmartObjectLayer クラスと PsdLoadOptions.LoadEffectsResource フラグを提供し、これらの効果を保持します。そのため、プログラムでスマートオブジェクトのコンテンツを抽出し、スタイリングを失うことなく効果を含んだ忠実なレンダリングをエクスポートできます。

PSD ファイルでスマートオブジェクトとエフェクトを扱う理由

スマートオブジェクトのコンテンツとエフェクトを保持することは、実際のシナリオでいくつか重要です。グラフィックデザインのパイプラインでは、テンプレートから単一のスマートオブジェクトを抽出し、Web やモバイル用のスタンドアロン資産として使用する必要があることがよくあります。そのレイヤーのエフェクトが変換中に失われると、デザイナーは手動で再適用しなければならず、オートメーションの目的が失われます。プレビュー生成のために PSD ファイルを取り込むコンテンツ管理システムも、すべてのレイヤーとエフェクトを含む忠実な表現が必要です。

Aspose.PSD は、2 つの関連しながらも異なる操作に対して明示的な制御を提供します。1 つはスマートオブジェクト自身の埋め込みソース(元々配置された画像)を読み取ること、もう 1 つはレイヤー効果が適用された状態でキャンバス上に表示されるスマートオブジェクトをレンダリングすることです。これら 2 つを別々に扱うことが重要です — これらを混同すると API のこの部分を使用する際に最も一般的なミスとなります。本チュートリアルでは、両方を正しく扱う方法を解説します。

Aspose.PSD を使用した PSD ファイルのスマートオブジェクトとエフェクトの処理

スマートオブジェクトの使用を開始するには、.NET プロジェクトに Aspose.PSD ライブラリをインストールする必要があります。最も簡単な方法は NuGet を使用することです:

Install-Package Aspose.PSD

パッケージを参照したら、Aspose.PSD 製品ページで完全な API ドキュメントを確認できます。このチュートリアルで使用される主要なクラスは次のとおりです:

  • PsdLoadOptions (namespace Aspose.PSD.ImageLoadOptions) — PSD ファイルの解析方法を制御し、レイヤー効果リソースを読み込むかどうかを含みます。
  • Image.Load — ファイルパスとロードオプションから Image インスタンスを作成する静的ファクトリメソッドです。
  • SmartObjectLayer (namespace Aspose.PSD.FileFormats.Psd.Layers.SmartObjects) — PSD ファイル内のスマートオブジェクトを表します。埋め込みコンテンツを読み取るために LoadContentsExportContents を公開しています。
  • PsdImage (namespace Aspose.PSD.FileFormats.Psd) — PSD ファイル用の具体的な画像タイプです。
  • Layer.IsVisible (namespace Aspose.PSD.FileFormats.Psd.Layers) — レイヤーの可視性を切り替えます。これにより、保存前に特定のレイヤーを分離できます。
  • PngOptionsPngColorType — PNG のエクスポートを構成します。特に透過出力が必要な場合に使用します。

以下のセクションでは、各ステップを示す完全なエンドツーエンドの例を順に説明します。

PSD ファイルのスマートオブジェクトとエフェクトの扱い: ステップバイステップ ガイド

以下は、PSD 内のスマートオブジェクトを検出し、その埋め込みコンテンツをエクスポートし、さらにスマートオブジェクトレイヤー — エフェクト付きで — を PNG として個別にレンダリングする実践的な手順です。

1. ファイルパスとロードオプションの準備

入力 PSD ファイルと出力 PNG の保存先を定義します。また、LoadEffectsResourcetrue に設定してエフェクトリソースの読み込みを有効にする必要があります。これにより、スマートオブジェクト上のレイヤー効果が保存時に最終的に結合された画像にレンダリングされます。

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) は同じエクスポートを1回の呼び出しで行い、その元の形式の拡張子を使用して書き込みます。

5. スマートオブジェクトレイヤーをその効果を適用した状態でレンダリングする

レイヤー効果 — ドロップシャドウ、グロー、ベベル — は外部ドキュメントに属し、スマートオブジェクト自身のコンテンツには含まれません。そのため LoadContents はそれらを決して含みません。キャンバス上に表示されているスマートオブジェクトのフラットな画像(効果を含む)を取得するには、他のすべてのレイヤーを非表示にし、全体の PsdImage を保存します。読み込み時に LoadEffectsResourcetrue に設定されているため、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)は、スマートオブジェクトのみを表示し、そのエフェクトは Photoshop が表示するのと同じように正確にレンダリングされます。

6. 完全なコードリスト

次の例は、両方の手順を1つの自己完結型プログラムにまとめます: スマートオブジェクトを検出し、そのコンテンツをエクスポートし、次にエフェクトが適用されたレイヤーを分離してレンダリングします。

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 を指し、contentFilerenderedFile は 2 つの PNG 出力です。
  2. ロードオプションを構成LoadEffectsResource = true は Aspose.PSD にレイヤー効果リソースを読み込むよう指示し、保存時にレンダリングできるようにします。
  3. PSD をロードImage.Load は汎用 Image を返し、PSD 固有の機能のために PsdImage にキャストします。
  4. スマートオブジェクトを検索 — コードは固定インデックスを前提とせず、is SmartObjectLayer で各レイヤーをチェックします。
  5. 埋め込みコンテンツをエクスポートLoadContents はスマートオブジェクト自身のソース画像を返し、RasterImage にキャストして PNG として保存します。
  6. 分離してレンダリング — 他のすべてのレイヤーを非表示にし、全体の PsdImage を保存すると、スマートオブジェクトだけのフラットな PNG が生成され、効果が焼き込まれます。
  7. リソースのクリーンアップusing ブロックは、外部の PsdImage と内部のコンテンツ画像を、それぞれの使用が終わった時点で破棄します。

無料ライセンスを取得

評価目的で一時的な無料ライセンスを取得するには、Aspose 無料ライセンスページをご利用ください。ライセンスは評価用の透かしを除去し、独自の環境でスマートオブジェクトワークフローをテストできるようにします。

無料の追加リソース

結論

PSD ファイル内のスマートオブジェクトとそのエフェクトの処理は、もはや手動の Photoshop 手順を必要としません。Aspose.PSD の SmartObjectLayerPsdLoadOptions.LoadEffectsResource、および Layer.IsVisible を使用することで、.NET 開発者はプログラムからスマートオブジェクト自体のコンテンツを抽出し、レイヤーエフェクトを保持したまま別個にレンダリングし、その結果を自動化パイプラインに統合できます。サンプルコードは、バッチ処理、UI ツール、またはサーバーサイドの画像サービス向けに適応できる完全なワークフローを示しています。

よくある質問

  1. Aspose.PSD の SmartObjectLayer とは何ですか?
    SmartObjectLayer は PSD ファイル内のスマートオブジェクトレイヤーを表します。埋め込みまたはリンクされた画像コンテンツを独自に保持しており、ドキュメントの他の部分とは独立してロード、置換、またはエクスポートできます。

  2. PSD を読み込む際にエフェクトを保持するためにオプションを有効にする必要がありますか? はい — PsdLoadOptions.LoadEffectsResourcetrue に設定します(名前空間 Aspose.PSD.ImageLoadOptions)ので、ドロップシャドウやグローなどのサポートされているレイヤーエフェクトが、保存時に最終的にマージされた画像にレンダリングされます。

  3. プログラムでスマートオブジェクトを通常のラスターレイヤーに変換できますか? SmartObjectProvider.ConvertToSmartObject は実際には逆の動作を行います — 通常のレイヤーを新しい埋め込みスマートオブジェクトにラップします。エフェクトが適用されたスマートオブジェクトのフラットな PNG を取得するには、他のレイヤーの Layer.IsVisiblefalse に設定し、包含する PsdImage を保存します。

  4. 同じPSDで複数のスマートオブジェクトを処理することは可能ですか?
    はい — psdImage.Layers を反復処理し、is SmartObjectLayer パターンで各レイヤーをチェックし、見つかった各オブジェクトに対して抽出とレンダリングの手順を繰り返します。

  5. スマートオブジェクトを PNG として保存する際に透明性を保持するために推奨される画像形式は何ですか?
    PngOptions を使用し、ColorType = PngColorType.TruecolorWithAlpha を設定して、完全なアルファチャンネル情報を保持します。

  6. 本番環境でサンプルコードを実行するにはライセンスが必要ですか?
    評価には一時的な無料ライセンスで十分ですが、ライセンスがない場合は出力に透かしが入ります。 本番での使用には完全な Aspose.PSD ライセンスが必要です。

続きを読む