怎样编写一个Photoshop滤镜(1)

简介: 在很久前我曾经写过一篇文章简要讲述了 Photoshop 的滤镜开发的基本概念,并描述了滤镜和 PS之间的协作关系,也提供了一个雨滴效果滤镜的 Demo。但是缺少源代码。而且我们将要产生疑问,我们如何从头开始编写一个 Photoshop 滤镜呢?我们如何建立一个最简单的 PS 滤镜插件的基本框架,然后在这个基础上继续添加我们想要的功能呢?这里,我就以回答一个网友向我提出的问题为例,从最基本的建立项目开始讲起。

            在很久前我曾经写过一篇文章简要讲述了 Photoshop 的滤镜开发的基本概念,并描述了滤镜和 PS之间的协作关系,也提供了一个雨滴效果滤镜的 Demo。但是缺少源代码。而且我们将要产生疑问,我们如何从头开始编写一个 Photoshop 滤镜呢?我们如何建立一个最简单的 PS 滤镜插件的基本框架,然后在这个基础上继续添加我们想要的功能呢?这里,我就以回答一个网友向我提出的问题为例,从最基本的建立项目开始讲起。这个例子(也是这个网友的问题)是,他想做一个最简单的滤镜,也就是仅仅把图像填充为“红色”。对于 PS 用户来说,这当然是非常简单容易的事情,只需要一个快捷键操作而已,(滤镜通常是用于完成比较复杂的任务的),我们就从这个最基本的例子出发讲解编写滤镜的过程。在文章最后将附上范例的源码下载链接。

            (1)我们使用的开发工具是 Visual Studio .NET 2005 版本,搭配 Photoshop SDK CS(本质上就是一些C++代码和资源等文件组成的发行包)。开发语言使用的是C和C++。

            那么使用C#或者其他语言行吗?目前来看可行性不大。所以要开发 Photoshop 滤镜,则要求开发者必须具有较好的C 和 C++ 基础,这是最重要的。当然如果开发者熟悉图像处理,数字信号处理的基本知识将会更好。

            (2)准备好工具后,我们打开 VS2005,新建项目。项目模板我们选择 Visual C++ 的 Win32。项目名称我们输入我们想要创建的滤镜名称,例如“FillRed”滤镜,表示这个滤镜用于填充红色,如下图:

                  

                  点击确定以后,在弹出的设置对话框上,点击“应用程序设置”,在应用程序类型中选择选择“DLL”,然后点击确定。

                  

                  (3)项目建立为一个标准DLL项目,我们在“解决方案资源管理器”中右键点击项目名称,在项目属性中我们做如下一些设置:

                  (a)在常规中,我喜欢把项目使用的字符集改为“使用多字节字符集”,这使我们可以用char*以及直接使用双引号的字符串类型。当然也可以使用Unicode,但是两者的使用的字符串函数会有所不同。可以随你的喜欢设定。

                  (b)项目已经默认输出为DLL, 由于Photoshop的滤镜文件的扩展名是8bf,所以我们在链接器->常规中,把输出文件的扩展名8bf。改为如下图所示。

                  

                  (c)下面点击工具-》选项,在弹出的对话框中,选择“项目和解决方案”-》VC++目录, 在右侧下拉框中选取“包含文件”:把几个Photoshop SDK的文件夹添加到 选项的VC++包含目录中,这将会方便我们编译项目时不会报告找不到文件的错误。如下图所示:

                  

        $(PS_SDK)\photoshopapi\photoshop

        $(PS_SDK)\photoshopapi\pica_sp

          $(PS_SDK)\samplecode\common\includes

 

                  (4)到这里我们已经基本设置好了项目,然后我们打开DLL的主要源文件“FillRed.cpp”,我们把该源文件的代码替换为如下:

 

Code_FillRed.cpp

 

                  上面的代码也就是滤镜的一个基本框架,我们可以看到DLL将提供的一个导出函数是PluginMain函数,我们将把图像用 128*128 像素的切片进行分割处理,这可以使PS和滤镜之间每次传递较少量数据,尤其是对很大的图像来说,切片处理将有利于应对内存紧张的情况,也是 Photoshop 所提倡的,64*64 或者 128*128 是比较典型的尺寸。

                  其调用过程是,在 start 调用中初始化第一个贴片(Tile),然后我们把第一个贴片设置为outRect,表示我们请求PS提供一个缓冲区用以接收该矩形所在位置的处理后数据,至于inRect,由于我们仅仅是填充,所以我们不关心图像的原来颜色如何,所以 inRect 可以设置为“空矩形”。图像的通道这里我们为了代码的直观和简单起见,我们就仅仅考虑RGB图像,即有3个通道的图像。设置好第一个 outRect,然后PS就会依次不停的开始进行 continue 调用,贴片从左至右,从上到下的顺序拼贴,直到贴片全部处理完成。注意 inData 和 outData 是 PS 向滤镜提供的申请数据和“回写缓冲区”,一个用于读,一个用于写,它们的大小是由滤镜向PS通知请求时填写的数据控制的,操作时绝不能越出其边界。

                  【注意】在滤镜处理数据的代码中请务必小心操作,一旦指针越界将会导致 Photoshop 程序崩溃!

                  有关该滤镜主体代码详细请参见代码注释,以及我此前一篇文章的解释。以及PS SDK的官方文档。这里我们就不再细述代码的原理了,因为它是很简单的。上面的一切代码里面需要引用ps sdk中的头文件。

 

                  (4)这时,项目已经可以成功编译。但下面一步是是欠入 PIPL 资源。

                  必须为滤镜插入 PIPL 资源,才能被Photoshop所正确识别和加载。根据PS提供的文档介绍,PIPL的发音读作"pipple",它表示 Plug-In Property List。它是一个灵活,可扩展的用于表示插件模块元数据(metadata)的数据结构。pipl包括了Photoshop识别和加载插件模块的所有信息,包含一些标记,以及控制每个插件的各种静态属性等等,你的滤镜可以包含一个或者多个“pipl”结构。

                  为滤镜插入pipl资源的过程如下,首先我们需要给项目添加一个*.r(Macintosh的Rez文件)文件,然后使用 cl.exe 把这个文件编译为一个 *.rr文件,最后用 Ps SDK提供的一个资源转换工具 CnvtPipl.Exe 把*.rr 文件转换为 *.pipl 文件,然后为滤镜添加一个 *.rc资源文件,在rc文件的末尾把 pipl文件包含进来即可。

                  ps sdk已经为我们提供了一个通用的 r文件,包括了通用的属性定义,它是 PIGeneral.r 文件。

                  (a)下面我们就为项目添加一个 r文件,在资源管理器中右键点击“资源文件”文件夹,点击添加新的文件,文件名输入“FillRed.r”。双击打开该文件,复制以下内容:

 

Code_FillRed.r

 

                  在FillRed.r文件中我们可以看到我们定义了滤镜的名称,所在的滤镜分组名称(Category),可以启用的图像模式等信息。然后右键点击该文件,在该文件的自定义生成规则的命令行中,点击编辑,输入以下内容:

                  

                  在“命令行”一栏点击编辑按钮,在弹出的窗口中输入以下两行:

cl /I E:\Codes\Adobe~1\samplecode\Common\Includes /IE:\Codes\Adobe~1\PhotoshopAPI\Photoshop /IE:\Codes\Adobe~1\PhotoshopAPI\PICA_SP /IE:\Codes\Adobe~1\samplecode\Common\Resources /EP /DWIN32=1 /Tc"$(InputPath)" > "$(ProjectDir)\$(InputName).rr"


Cnvtpipl.exe "$(ProjectDir)\$(InputName).rr" "$(ProjectDir)\$(InputName).pipl"

 

            其中,第一行表示使用 CL.EXE 把该文件编译为 *.rr文件,上面的“/I”选项表示需要的包含目录。

            第二行表示使用PS SDK中的 Cnvtpipl.exe 工具把 rr文件编译为 pipl文件,请注意为了简单,我把该工具复制到了项目的源文件所在文件夹下面。它位于SDK的路径是:“\samplecode\resources\cnvtpipl.exe”。

            (b)下面我们为项目添加一个 rc文件,同样右键点击“资源文件”,添加一个FillRed.rc文件。

            这是一个windows的资源文件,我们暂时还不需要任何资源,所以我们直接用文本方式打开IDE自动生成的RC文件,在结尾处添加下面的一行:

            

Code_FillRed.rc

 

            (5)我们编译项目,即可在项目的输出目录中看到 生成 FillRed.8bf 文件,下面我们把这个文件复制到 Photoshop的滤镜文件夹下面,例如我的Photoshop CS的滤镜所在目录是:“D:\Program Files\Adobe\Photoshop CS\增效工具\滤镜”

                  

 

            最后我们启动Photoshop,Photoshop会扫描插件目录,并把我们的滤镜加载到相应的菜单上,我们选择一个矩形选区,然后点击我们制作的滤镜相应菜单,即可看到效果,如下图所示。注意,下面的例子的效果是我仅仅把蓝通道填充了255。

                  

                  在Photoshop 的帮助菜单- 关于增效工具 - 的子菜单中,可以看到我们编写的“FillRed Filter ...”一项,当点击它时PS即发起 about 调用,即可看到弹出的 MessageBox。

 

                  (6)最后,还是附上这个小例子的源代码下载链接:

                  请注意这个项目中有一些设置,比如 PhotoshopSDK的目录等,需要依据具体环境做出相应调整。PS SDK提供的资源转换工具也包含在项目文件夹内。(注意:附件中并未包含完整PS SDK)

                   http://files.cnblogs.com/hoodlum1980/FillRed.rar

                  (7)总结:

                  这一节讲述了从项目创建,到嵌入pipl资源,建立了一个基本的滤镜框架。但它的功能是非常基本和简单的,在以后的时间里,我们可能需要继续丰富这个例子,包括为它引入对话框资源,令PS为我们的滤镜缓存和读取我们的参数,包括在对话框表面绘制滤镜的预览图形等等。

 

                  我的相关文章:

                  《Photoshop第三方滤镜开发的简介》    

                  《Photoshop滤镜开发简介(2)--Photoshop回调函数》

                  

                                                                                                            --hoodlum1980    2009.05.11

 

目录
相关文章
|
机器学习/深度学习 存储 机器人
LLM系列 | 19: ChatGPT应用框架LangChain实践速成
本文以实践的方式将OpenAI接口、ChatOpenAI接口、Prompt模板、Chain、Agent、Memory这几个LangChain核心模块串起来,从而希望能够让小伙伴们快速地了解LangChain的使用。
|
人工智能
AI代码生成器——Codeium
【2月更文挑战第21天】AI代码生成器——Codeium
2090 1
AI代码生成器——Codeium
|
7月前
|
存储 人工智能 自然语言处理
JBoltAI识图阅卷解析:手写答题卡智能阅卷的技术实践
JBoltAI识图阅卷方案融合NLP与图像识别,自动提取手写答题卡题号及答案,生成结构化数据,提升阅卷效率、降低人工误差。适用于学校、考试机构等大规模场景,亦为Java开发者提供AI落地实践范例。(239字)
394 0
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
2737 0
|
7月前
|
运维 关系型数据库 MySQL
告别SQL指令!OpenClaw(Clawdbot)阿里云部署集成MySQL专属Skill +免费API配置及避坑手册
在数据库运维场景中,复杂的SQL指令、频繁的状态巡检、突发的故障排查,往往占用技术人员大量时间。而OpenClaw(原Clawdbot)作为2026年爆火的开源AI助手框架,与火山引擎云数据库MySQL版的结合,彻底改变了这一现状——通过配置`volcengine-rds-mysql`专属Skill,即可用自然语言实现数据库实例管理、数据查询、性能监控、故障排查,甚至7×24小时智能管控,大幅降低运维门槛与成本。
1148 2
|
3月前
|
人工智能 BI API
阿里云Qwen3.8-Max-Preview介绍:核心能力、适用场景、支持订阅计划与最新活动
阿里云于2026年7月19日发布Qwen3.8-Max-Preview,为通义千问首个2.4T参数原生多模态旗舰模型,采用第三代MoE架构,支持百万Token上下文、全栈代码工程、原生多模态处理及多智能体协作,较Qwen3.7-Max全面跃升。模型处于"日更进化"预览阶段,现推出限时优惠:常规时段1折、夜间0.2折(22:00-次日08:00),适用于Qoder CN全系产品。个人版Token Plan低至39元/月,团队版150元/席位/月起,配合新用户25元体验包及14天Pro Trial,是开发者与企业低成本体验顶级大模型的绝佳窗口。
|
传感器 算法 芯片
基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)(上)
基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)(上)
2495 0
|
11月前
|
人工智能 自然语言处理 搜索推荐
限免领取 |2025版《102个增长实例》正式发布
瓴羊联合一财商学院发布《102个增长实例》,聚焦2025年企业数智化转型,通过19个实战案例展现AI Agent在客服、分析、营销三大场景的深度应用,揭示“大模型×好数据×强场景”的黄金公式,推动人机协同新范式,助力企业实现高效增长。
527 2
|
数据可视化 图形学 开发者
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(上)
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例
6377 61
|
存储 缓存 NoSQL
redis4.0之MEMORY命令详解
在过去,查看redis的内存使用状态只有info memory命令,而且也只有一些基础信息,想要获取全局信息就有些困难。4.0开始redis提供了`MEMORY`命令,一切都变得简单起来。
10621 153

热门文章

最新文章