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‑shirt 的摺痕,為行銷團隊製作模板變體,或審核 PSD 模板庫,以確認每個檔案使用相同的濾鏡設定。
手動在 Photoshop 中執行此操作無法擴展,將效果平鋪為像素會失去日後編輯的能力。透過在 C# 中讀寫 Displace 智慧濾鏡資料,您可以保持濾鏡的非破壞性並在 Photoshop 中可編輯,同時可從伺服器端程式碼、背景工作或桌面工具進行控制。
使用 Aspose.PSD 讀取和寫入 Displace 智能濾鏡資料
Aspose.PSD for .NET 使 C# 開發人員能夠直接透過 DisplaceSmartFilter 類別讀取和寫入 Displace 智慧濾鏡資料。
入門指南
安裝 Aspose.PSD NuGet package(版本 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;
您還需要兩個輸入檔案:一個包含至少一個 Smart Object 圖層的 PSD,另一個用作位移圖的 PSD。欲了解 API 詳細資訊,請參閱 Aspose.PSD for .NET 文件說明 以及 智慧濾鏡指南。
DisplaceSmartFilter 屬性概覽
| Property | Type | Purpose |
|---|---|---|
HorizontalScale | double | 水平位移比例,與 Photoshop 的 Displace 對話框相同 |
VerticalScale | double | 垂直位移比例 |
DisplacementMethod | DisplacementMethod | Tile 會重複圖案;Stretch 會調整圖案大小以適應圖層 |
UndefinedAreas | UndefinedAreas | WrapAround 或 RepeatEdgePixels 用於圖層外移的像素 |
IsDisplacementMapEmbedded | bool | 指示圖案是否嵌入在 PSD 中 |
DisplaceMapData | — | 嵌入的位移圖案資料 |
DisplacementMapPath | string | 位移圖案的路徑 |
如何在 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);
}
說明
- Loading the PSD –
Image.Load返回一個通用的Image,然後將其轉換為PsdImage以存取 PSD 特有的功能,例如圖層和智慧濾鏡。 - Finding the Smart Object layer –
OfType<SmartObjectLayer>()會選取第一個 Smart Object 圖層,如果不存在則會以明確的訊息失敗。這比直接索引Layers更安全,因為圖層順序在不同檔案中會有所變化。 - Creating the filter –
DisplaceSmartFilter(string, bool)建構函式接受位移圖的路徑以及一個控制是否嵌入圖的旗標。傳入true會使輸出的 PSD 成為自包含的。 - Configuring the filter –
HorizontalScale與VerticalScale設定位移強度。DisplacementMethod.Tile會在圖層上重複圖案,而Stretch則會將其拉伸以適應。UndefinedAreas.WrapAround會以相對邊緣的內容填補移出畫布的像素;RepeatEdgePixels則會延伸邊緣顏色。 - Updating the collection –
SmartFilters.Filters以陣列形式公開。將其複製到List<SmartFilter>,加入新濾鏡,然後再指派ToArray()回去,可保留圖層上已存在的任何智慧濾鏡。 - Persisting the changes –
UpdateResourceValues()會將濾鏡集合寫入圖層的 PSD 資源。若省略此呼叫,新的濾鏡在儲存時會遺失。 - Saving –
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}.");
}
}
說明
- 重新載入檔案 –
Image.Load會開啟先前步驟中儲存的 PSD。 - 定位 Smart Object 圖層 – 相同的基於類型的查找確保讀寫步驟保持一致。
- 依類型尋找濾鏡 –
OfType<DisplaceSmartFilter>().LastOrDefault()會回傳最近新增的 Displace 濾鏡,且永遠不會產生無效的型別轉換。這比讀取陣列最後一個元素並使用as轉型更可靠,因為若該位置的濾鏡不同,as會靜默回傳null。 - 讀取屬性 – 所有濾鏡設定皆以具體型別屬性提供,因而可以記錄、比較或匯出成報告。
- 驗證 –
AssertAreEqual輔助方法會比較持久化的值與原始值,若有任何不匹配,會拋出帶有描述性訊息的例外。
結論
使用 Aspose.PSD for .NET 中的 DisplaceSmartFilter 類別,C# 開發人員可以在程式碼中完整地新增、設定、儲存以及讀取 Photoshop Displace 智慧濾鏡。此濾鏡在 Photoshop 中保持非破壞性且可編輯,位移圖可以隨 PSD 一起傳遞,且相同的 API 支援往返驗證。這使得在 .NET 上構建樣機產生器、模板流程以及 PSD 稽核工具變得相當直接。
常見問題
哪個版本的 Aspose.PSD for .NET 支援 Displace 智慧濾鏡? 讀寫 Displace 智慧濾鏡資料的功能是在 Aspose.PSD for .NET 26.8 中引入的。請使用 26.8 或更高版本以存取
DisplaceSmartFilter類別。我可以將 DisplaceSmartFilter 添加到普通光柵圖層嗎? 智能濾鏡資料與 Smart Object 圖層一起儲存,因此必須將濾鏡新增至
SmartFilters集合中的SmartObjectLayer。如果您的內容位於普通圖層,請先將其轉換為 Smart Object。如何在 PSD 中嵌入位移圖? 將位移圖路徑和
true傳遞給DisplaceSmartFilter建構函式。保存後,IsDisplacementMapEmbedded會返回true,而DisplaceMapData保存嵌入的位移圖資料。UndefinedAreas 屬性可以接受哪些值?
UndefinedAreas支援WrapAround,它會以圖像相對邊緣的內容填充未定義的像素,並且支援RepeatEdgePixels,它會延伸邊緣像素的顏色。DisplacementMethod.Tile 與 DisplacementMethod.Stretch 有何差異?
Tile會在圖層上以原始大小重複位移圖,而Stretch會調整圖的大小以適應圖層。修改智慧篩選器後,我必須呼叫 UpdateResourceValues 嗎?
是的。UpdateResourceValues會將修改過的篩選器集合寫入智慧物件圖層的資源中。如果不這麼做,當您儲存時新篩選器將不會被保留。
取得免費授權並探索更多
透過請求臨時授權,無限制評估 Aspose.PSD for .NET:
在 .NET 中處理 PSD 檔案的其他資源:
