Displace 滤镜是 Photoshop 最有用的畸变工具之一。它根据单独的位移图的亮度值扭曲图层像素,这正是设计师将艺术作品包裹在布料褶皱上、添加波纹效果或将徽标贴合到纹理表面的方式。当该滤镜作为智能滤镜应用时,其设置保存在 PSD 文件中并且可以完全编辑。本文展示了如何在 C# 中读取和写入 Displace 智能滤镜数据。您将向 Smart Object 图层添加 Displace 智能滤镜,配置其比例和边缘处理选项,嵌入位移图,保存 PSD,然后读取滤镜设置以验证往返过程——全部无需安装 Adobe Photoshop。
Key Takeaways
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# 中读取和写入位移智能滤镜数据,您可以保持滤镜的非破坏性并在 Photoshop 中可编辑,同时可以从服务器端代码、后台作业或桌面工具进行控制。
使用 Aspose.PSD 读取和写入位移智能滤镜数据
Aspose.PSD for .NET 使 C# 开发人员能够直接通过 DisplaceSmartFilter 类读取和写入 Displace 智能滤镜数据。
入门
在 Package Manager Console 中安装 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 属性概览
| 属性 | 类型 | 目的 |
|---|---|---|
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);
}
说明
- 加载 PSD –
Image.Load返回一个通用的Image,随后将其强制转换为PsdImage以访问 PSD 特有的功能,如图层和智能滤镜。 - 查找 Smart Object 图层 –
OfType<SmartObjectLayer>()选择第一个 Smart Object 图层,如果不存在则会以明确的消息失败。这比直接索引Layers更安全,因为不同文件的图层顺序可能不同。 - 创建滤镜 –
DisplaceSmartFilter(string, bool)构造函数接受位移图的路径以及一个控制是否嵌入该图的标志。传入true可使输出的 PSD 成为自包含文件。 - 配置滤镜 –
HorizontalScale和VerticalScale设置位移强度。DisplacementMethod.Tile在图层上平铺位移图,而Stretch则将其拉伸以适应。UndefinedAreas.WrapAround用对侧边缘的内容填充移出画布的像素;RepeatEdgePixels则延伸边缘颜色。 - 更新集合 –
SmartFilters.Filters以数组形式公开。将其复制到List<SmartFilter>,添加新滤镜后再使用ToArray()赋回,可保留图层上已有的所有智能滤镜。 - 持久化更改 –
UpdateResourceValues()将滤镜集合写入图层的 PSD 资源。如果跳过此调用,新的滤镜在保存时会丢失。 - 保存 –
image.Save(outputFile)将更新后的 PSD 写入磁盘。
如何在 C# 中读取 Displace Smart Filter 数据
保存 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进行转换更可靠,后者如果该位置的过滤器不同会静默返回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 filter 数据存储在 Smart Object 图层中,因此该过滤器必须添加到
SmartFilters集合的SmartObjectLayer中。如果您的内容位于普通图层,请先将其转换为 Smart Object。如何在 PSD 中嵌入位移图? 将位移图路径和
true传递给DisplaceSmartFilter构造函数。保存后,IsDisplacementMapEmbedded返回true,并且DisplaceMapData保存嵌入的图像数据。UndefinedAreas 属性可以接受哪些值?
UndefinedAreas支持WrapAround,它会用图像相对边缘的内容填充未定义的像素,并且支持RepeatEdgePixels,它会扩展边缘像素的颜色。DisplacementMethod.Tile 与 DisplacementMethod.Stretch 有何区别?
Tile在图层上以原始大小重复位移图,而Stretch将位移图调整大小以适应图层。在修改智能过滤器后,我是否必须调用 UpdateResourceValues? 是的。
UpdateResourceValues将修改后的过滤器集合写入 Smart Object 图层的资源。如果不调用它,保存时新过滤器将不会被持久化。
获取免费许可证并探索更多
通过请求临时许可证,评估 Aspose.PSD for .NET,且不受限制:
在 .NET 中处理 PSD 文件的其他资源:
