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

简介: 在上一篇文章中,我们讲解了怎样创建一个Photoshop滤镜的项目,以及如何为滤镜嵌入PIPL资源使滤镜可以被PS识别和加载。并且我们已经建立了一个最简单最基本的滤镜框架。在这篇文章中,我们将细化滤镜和PS之间的调用流程,我们将为滤镜引入一个对话框资源,使用户可以对滤镜进行自定义参数的配置。

            在上一篇文章中,我们讲解了怎样创建一个Photoshop滤镜的项目,以及如何为滤镜嵌入PIPL资源使滤镜可以被PS识别和加载。并且我们已经建立了一个最简单最基本的滤镜框架。在这篇文章中,我们将细化滤镜和PS之间的调用流程,我们将为滤镜引入一个对话框资源,使用户可以对滤镜进行自定义参数的配置。并且我们将看到当用户从不同菜单位置发起滤镜调用时的流程区别,然后我们还将为我们的滤镜参数引入PS脚本描述系统的读写支持,将我们的参数存入PS的脚本系统中,并在以后的调用中读取出这些参数。

            (1)设计我们的滤镜参数。

            我们的滤镜完成的是一个最基本的任务,仅仅是“填充”,因此我们可以对填充的颜色进行配置,此外,我们还可以设置填充颜色的不透明度。因此我们引入下面的参数,把它定义为一个struct,包括一个RGB填充色,和一个不透明度(0~100):

 

// ======================================
//         定义我们的参数
// ======================================
typedef  struct  _MYPARAMS
{
    COLORREF fillColor; 
// 填充颜色
     int       opacity;     // 百分比(0~100)
} MYPARAMS;

 

            (2) 现在我们添加一个对话框资源。编辑对话框模块如下所示。然后我们对主要控件设置控件ID。

            【注意】编辑资源文件后,由于VC将会重写rc文件,因此在编译项目前,我们还需要手工打开rc文件,自己重新添加#include "FillRed.pipl"。

                        否则编译好的滤镜将无法被PS正确识别和加载到滤镜菜单。

            

            (3)下面我们为该对话框添加窗口过程。为此我们为项目添加 ParamDlg.h 和 ParamDlg.cpp文件。

            【注意】由于窗口过程位于我们的DLL中,因此我们必须把窗口过程声明为DLL导出函数,以便让系统知道该函数的地址。

            关于窗口过程的编写则完全属于 windows 编程领域的内容(这方面的知识可以参考相关书籍),这里我们不详细介绍怎样写窗口过程。但值得一提的是,我在这里引入了一个PS中的UI特性,即PS中例如它的字体设置对话框,当鼠标悬停在控件前面的Lable(Static标签)上方时,光标形状可以改变为特殊光标,按下并左右拖动鼠标,则相关控件的值就会根据鼠标移动方向自动增加或减小,类似slider控件的效果。因此我在窗口过程中为它加入了这个特性,这会使得窗口过程的代码看起来稍显复杂一些,不过这个功能(可能是PS发明的?)很有趣也很新颖。为此我还引入了一个自定义的光标文件。具体代码不贴出了,请参考项目源代码中的 ParamDlg.cpp文件中的代码。 

            (4)在第一篇文章的基础上,我们需要改写FillRed.cpp中的一些代码。

            因为现在我们引入了不透明度参数,不透明度的算法是:(opacity = 0~ 100)

            结果值 = 输入值 * (1- opacity*0.01) + 填充颜色 * opacity*0.01;

            (a)对DoStart 和 DoContinue:我们需要知道原图中原来的颜色,因此我们的 inRect 和 inHiPlane 将不在为空矩形。这体现在 DoStart 和 DoContinue 函数中,我们对inRect 和 inHiPlane 修改为和 outRect , outHiPlane 一致,这样PS就会把原图数据通过 inData 发送给我们。

            (b)当用户点击滤镜菜单时,将从 parameter 调用开始,这样我们就在这里设置一个标记,表示需要显示对话框。

            (c)当用户点击“最近滤镜”菜单时,将从 prepare 调用开始,这样表示我们不需要显示对话框,而是直接取此前的缓存参数。为此我们引入 ReadParams 和 WriteParams 函数。即使用PS提供的回调函数集使我们的参数和PS Scripting System进行交换数据。

             下面我们主要看一下DoContinue函数发生的变化。主要是对算法进行了改动,对 inRect , inHiPlane 这两个数据进行了变动,以请求PS发送数据。在DoStart()函数中设置了第一个贴片,对inRect 和 inHiPlane 的改动是同样的。同时,在DoStart函数中, 根据事先设置过的标志,来决定是否显示对话框。

 

Code_DoStart_And_DoContinue

 

 

            (5)从PS Scripting System中读写我们的参数,我们为项目添加 ParamsScripting.h 和 ParamsScripting.cpp,代码如下。引入ReadParams 和 WriteParams 方法,该节主要涉及 PS 的描述符回调函数集,比较复杂,但在这里限于精力原因,我也不做更多解释了。具体可以参考我以前发布的相关随笔中有关讲解PS回调函数集的一篇文章以及代码注释。其相关代码如下:

 

 

Code_ParamsScripting.cpp

 

 

            (6)这样我们就完整支持了参数读写,我们可以在执行滤镜时,点击“好”按钮,即可将参数更新到PS脚本系统,下次调用时会自动从脚本系统中读取上一次的参数值,并使用读取出的值初始化对话框。而当我们点击“最近滤镜”命令时,滤镜将会采用脚本系统中的参数,并且不显示对话框。

                  

 

            (7)下面是源代码的下载链接:

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

                 【注意】为了节省空间,提供源码时,我将覆盖以前的项目版本,也就是说在原有基础上增量更新而不再保留历史版本。

            (8)总结:

            这一节主要讲解为滤镜引入自定义参数以及相关的对话框资源,然后为参数增加PS脚本系统的读写支持。

            到目前为止,这个滤镜已经具有比较完整的框架了,也能够被动作录制和回放。

            (a)但美中不足的是,对“动作录制和回放”的支持还不够完备,我们将看到当把滤镜录制为动作时,其对话框选项的勾选框是没有的,也就是我们没法设置对话框显示的“显示”,“不显示”,“安静”三种模式,这是因为我们还没有为滤镜引入必须的事件,描述符键等相关的“术语”(aete)资源。

            (b)我们还希望为滤镜的对话框引入“预览”机制,即我们希望在对话框上显示一小块图片供用户预览效果,这样用户就可以根据视觉反馈方便的调节滤镜参数。

            在此后,我们将有可能进一步讲解PS的回调函数集,例如如何让PS为我们申请内存,如何更新PS的进度条,如何更完善的处理用户交互,以及引入“预览”支持,引入aete资源等相关内容。

            (9)最后更新:把RGB三个通道共用一个不透明度参数,调整为可以单独每个通道的合成不透明度。因此对话框做了相应修改。

 

            我的相关文章:

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

目录
相关文章
element-plus:el-date-picker日期只选择年月不要日
element-plus:el-date-picker日期只选择年月不要日
1540 0
|
Web App开发 编解码 Android开发
2023年音视频开发知识技术合集(基础入门到高级进阶)
2023年音视频开发知识技术合集(基础入门到高级进阶)
|
Web App开发 缓存 数据安全/隐私保护
解决浏览器自动填充用户名和密码最优雅的解决方案,优雅永不过时
浏览器记住用户名和密码并且自动填充怎么破?百度找的方法好像都不够优雅,优雅永不过时,今天我就带你优雅的解决这个问题。
3140 0
|
传感器 数据采集 物联网
STM32:高性能微控制器与广泛的应用领域
STM32:高性能微控制器与广泛的应用领域
1010 0
【最佳实践】宜搭的报表分析功能
“单据表单”和”流程表单”中提交的数据,可以在”报表页面”中作为数据源,进行进一步的分析。当一个表单中存在明细时,为了支持分析,宜搭进行了一些额外的处理。下面以一个具体场景(进货单)进行具体介绍
【最佳实践】宜搭的报表分析功能
|
12月前
|
机器学习/深度学习 算法 数据挖掘
量子计算在金融领域的应用探索
量子计算凭借其强大的计算能力和数据处理能力,正逐渐在金融领域展现巨大潜力。本文探讨了量子计算在风险管理、投资组合优化、高频交易、反欺诈及金融衍生品定价等方面的应用,介绍了当前进展及未来挑战,展示了量子计算如何提升金融决策效率和准确性。
|
XML JavaScript 前端开发
如何优雅地使用 Stack Overflow?
如何优雅地使用 Stack Overflow?
1918 0
|
算法 安全 量子技术
量子计算与金融风险管理:提升市场预测能力
【10月更文挑战第8天】量子计算作为一种前沿技术,正在逐步改变金融风险管理的格局。通过利用其独特的计算能力和优化算法,量子计算可以显著提高市场预测的准确性和及时性,为金融机构提供更精准的风险管理工具。尽管目前仍面临一些挑战和限制,但随着技术的不断进步和完善,相信量子计算将在未来的金融风险管理领域发挥更加重要的作用。
|
应用服务中间件 nginx
nginx静态资源文件无法访问,403 forbidden错误
nginx静态资源文件无法访问,403 forbidden错误
1130 0
|
存储 弹性计算 安全
重磅!阿里云核心产品全线降价,大幅提升伙伴佣金,启动千问伙伴计划
今天,在2023阿里云合作伙伴大会上,阿里云宣布核心产品价格全线下调15%至50%,存储产品最高降幅达50%,这是阿里云史上最大规模降价。
2970 17