Displace フィルターは Photoshop の最も便利な歪みツールの一つです。別の変位マップの明るさ値に従ってレイヤーのピクセルを変形させ、デザイナーがアートワークを布のしわに巻き付けたり、リップル効果を加えたり、テクスチャ付き表面にロゴを合わせたりする際に使用されます。このフィルターをスマートフィルターとして適用すると、設定は PSD ファイル内に保存され、完全に編集可能なままです。本記事では C# で Displace スマートフィルターのデータを読み書きする方法を示します。Smart Object レイヤーに Displace スマートフィルターを追加し、スケールとエッジ処理オプションを構成し、変位マップを埋め込み、PSD を保存し、フィルター設定を読み戻してラウンドトリップを検証します — すべて Adobe Photoshop がインストールされていなくても実行できます。

主なポイント

  • DisplaceSmartFilter クラスは、Aspose.PSD for .NET 26.8 以降で利用可能で、Photoshop の Displace フィルタを強く型付けされた .NET オブジェクトとして公開します。
  • 水平および垂直スケール、変位方法(Tile または Stretch)、未定義領域の処理(WrapAround または RepeatEdgePixels)はすべてシンプルな読み書き可能プロパティです。
  • コンストラクタに true を渡すことで、変位マップを出力 PSD に埋め込むことができ、ファイルを自己完結型かつポータブルに保ちます。
  • SmartFilters.UpdateResourceValues() はフィルタ コレクションを変更した後に呼び出す必要があり、呼び出さないと変更が保存されません。
  • 同じ API は既存の PSD ファイルからフィルタ データを読み戻すことができ、検証、監査、バッチ処理に適しています。

Displace Smart Filter が重要な理由

デザイン自動化パイプラインでは、スケールで Photoshop の効果を再現する必要があることがよくあります。典型的な例としては、印刷デザインが T シャツの折り目に沿って配置される製品モックアップの生成、マーケティングチーム向けのテンプレートバリエーションの作成、またはすべてのファイルが同じフィルター設定を使用していることを確認するための PSD テンプレートライブラリの監査があります。

Photoshopで手作業で行うと規模の拡大ができず、効果をピクセルにフラット化すると後で編集できる能力が失われます。C#でDisplaceスマートフィルターデータを読み書きすることで、フィルターを非破壊かつPhotoshopで編集可能なままに保ちつつ、サーバーサイドのコード、バックグラウンドジョブ、またはデスクトップツールから制御できます。

Aspose.PSD を使用した Displace スマート フィルタ データの読み取りと書き込み

Aspose.PSD for .NET は、C# 開発者が DisplaceSmartFilter クラスを介して Displace スマートフィルタ データを直接読み書きできるようにします。

はじめに

Package Manager Console から Aspose.PSD NuGet パッケージ (バージョン 26.8 以降) をインストールします:

Install-Package Aspose.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;

また、2つの入力ファイルが必要です。1つは少なくとも1つの Smart Object レイヤーを含む PSD、もう1つは変位マップとして使用する PSD です。API の詳細については、Aspose.PSD for .NET ドキュメント と スマートフィルター ガイド を参照してください。

DisplaceSmartFilter プロパティの概要

プロパティ型目的
HorizontalScaledouble水平変位スケール、Photoshop の Displace ダイアログと同様
VerticalScaledouble垂直変位スケール
DisplacementMethodDisplacementMethodTile がマップを繰り返し、Stretch がレイヤーに合わせてマップのサイズを変更します
UndefinedAreasUndefinedAreasレイヤー外にシフトしたピクセルに対して WrapAround または RepeatEdgePixels を使用します
IsDisplacementMapEmbeddedboolマップが PSD に埋め込まれているかどうかを示します
DisplaceMapData—埋め込まれた変位マップデータ
DisplacementMapPathstring変位マップのパス

C# で Displace スマートフィルタを追加する方法

最初のステップは、Smart Object レイヤーを含む PSD を読み込むことです。その後、DisplaceSmartFilter を作成し、プロパティを構成して、レイヤーのスマートフィルタコレクションに追加し、結果を保存します。

次の C# の例では、Smart Object レイヤーに Displace スマートフィルタを追加し、構成します。

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

説明

  1. PSD の読み込み – Image.Load は汎用的な Image を返し、PsdImage にキャストしてレイヤーやスマートフィルタなどの PSD 固有機能にアクセスします。
  2. Smart Object レイヤーの検索 – OfType<SmartObjectLayer>() は最初の Smart Object レイヤーを選択し、存在しない場合は明確なメッセージで失敗します。Layers を直接インデックス指定するより安全です。レイヤーの順序はファイルごとに異なるためです。
  3. フィルタの作成 – DisplaceSmartFilter(string, bool) コンストラクタは変位マップのパスと、マップを埋め込むかどうかを制御するフラグを受け取ります。true を渡すと、出力 PSD が自己完結型になります。
  4. フィルタの構成 – HorizontalScale と VerticalScale は変位の強さを設定します。DisplacementMethod.Tile はマップをレイヤー全体に繰り返し、Stretch はフィットするようにサイズ変更します。UndefinedAreas.WrapAround はキャンバス外にシフトしたピクセルを反対側のエッジからの内容で埋め、RepeatEdgePixels はエッジの色を拡張します。
  5. コレクションの更新 – SmartFilters.Filters は配列として公開されています。これを List<SmartFilter> にコピーし、新しいフィルタを追加してから ToArray() で戻すことで、レイヤーに既に存在していたスマートフィルタを保持できます。
  6. 変更の永続化 – UpdateResourceValues() はフィルタコレクションをレイヤーの PSD リソースに書き込みます。この呼び出しを省略すると、保存時に新しいフィルタが失われます。
  7. 保存 – image.Save(outputFile) は更新された PSD をディスクに書き込みます。

C# で Displace スマートフィルタ データを読む方法

PSD を保存した後、再度読み込み、フィルタ プロパティを検査して、すべての値が正しく保持されていることを確認できます。同じアプローチは、Photoshop で作成された PSD ファイルにも適用できます。

以下の 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 ヘルパーは永続化された値と元の値を比較し、不一致がある場合は説明的なメッセージとともに例外をスローします。

結論

Aspose.PSD for .NET の DisplaceSmartFilter クラスを使用すると、C# 開発者はコードだけで Photoshop の Displace スマートフィルタを追加、構成、保存、そして読み戻すことができます。このフィルタは Photoshop で非破壊かつ編集可能なままであり、変位マップは PSD 内に保持でき、同じ API が往復検証をサポートします。これにより、.NET 上でモックアップジェネレータ、テンプレートパイプライン、PSD 監査ツールを簡単に構築できます。

FAQ

  1. Aspose.PSD for .NET のどのバージョンが Displace スマートフィルタをサポートしていますか? Displace スマートフィルタ データの読み取りと書き込みは Aspose.PSD for .NET 26.8 で導入されました。バージョン 26.8 以降を使用して DisplaceSmartFilter クラスにアクセスしてください。

  2. 通常のラスターレイヤーに DisplaceSmartFilter を追加できますか? Smart フィルターデータは 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 を評価し、一時ライセンスをリクエストしてください:

無料の一時ライセンスを取得する

.NET で PSD ファイルを扱うための追加リソース:

続きを読む