Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑工作。ps有很多功能,在图像、图形、文字、视频、出版等各方面都有涉及。
在第一篇文章中我们建立了一个没有UI的基本滤镜框架,并且引入PIPL资源使之能被PS加载到菜单。在第二篇文章中我们又引入了滤镜参数和相应的对话框资源,并且讲解了对话框在滤镜调用流程中的显示时机。这一篇文章我们将使滤镜支持动作记录和回放,也就是通过添加“术语资源”,使我们的滤镜参数被PS的脚本系统所获知(scripting-aware),并能够记录和回放。
从Photoshop 4.0开始引入了一个新的面板以及相应的命令和回调函数:动作面板(浮动窗口),以及Descriptor 回调函数集。动作面板是Photoshop脚本系统用于和用户交互的接口,也是其核心所在。Photoshop 5.0扩展了动作结构,使自动化插件能够支持可描述的Photoshop命令。(《Photoshop API Guide》第11章)
关于PS的 Scripting System,其来源是 PS 对苹果系统的事件和脚本机制的继承和支持,PS 的开发同时针对两种操作系统平台。这里我们介绍如何使我们的滤镜被PS脚本系统接纳。
首先我们需要在 r文件中增加术语资源(terminology resource)。因此首先在 pipl 资源中增加一个 HasTerminology 结构,其定义如下:
//这个属性指明滤镜是否提供了 'aete'资源。
typedef struct HasTerminology
{
int32 classID; // classID from 'aete'
int32 eventID; // eventID from 'aete' or NULL if none
int16 aeteResNum; // number of 'aete' resource
CString uniqueID; // unique ID string (UUID or your own ?/?). If present,
ignores AppleScript and keeps local to Photoshop.
} HasTerminology;
这个结构将被增加到 r文件的 pipl资源内。下面我们在pipl资源后面添加了 aete 资源。
在此前我们在一个通用的头文件中添加一些aete资源需要的定义:
//定义 Scripting Keys
#define KEY_FILLCOLOR 'fiCo'
#define KEY_OPACITY 'opcA'
#define plugInSuiteID 'filR'
#define plugInClassID 'filR'
#define plugInEventID 'filR'
#define plugInUniqueID "18EC4E8F-DB34-4aff-AF99-77C8013BD74F"
#define plugInAETEComment "FillRed example filter By hoodlum1980"
#define vendorName "hoodlum1980"
//定义 Scripting Keys
#define KEY_FILLCOLOR 'fiCo'
#define KEY_OPACITY 'opcA'
#define plugInSuiteID 'filR'
#define plugInClassID 'filR'
#define plugInEventID 'filR'
#define plugInUniqueID "18EC4E8F-DB34-4aff-AF99-77C8013BD74F"
#define plugInAETEComment "FillRed example filter By hoodlum1980"
#define vendorName "hoodlum1980"
上面我们把我们的滤镜,滤镜的参数都定义为了键,关于键定义,需要符合以下原则:
(a)它必须由4个字符组成。不够4个字符可以结尾用空格补足。
(b)用户定义的键名应该以小写字母开头,同时至少含有一个大写字母。(因为全大写,全小写键名属于Apple定义)。
滤镜的唯一标识符采用VC工具生成的GUID即可。
然后我们对r文件增加aete 资源,aete 资源模板如下:
resource 'aete' (0)
{ // aete version and language specifiers
{ /* suite descriptor */
{ /* filter/selection/color picker descriptor */
{ /* any parameters */
/ * additional parameters */
}
},
{ /* import/export/format descriptors */
{ /* properties. First property defines inheritance. */
/* any properties */
},
{ /* elements. Not supported for plug-ins. */
},
/* class descriptions for other classes used as parameters or properties */
},
{ /* comparison ops. Not currently supported. */
},
{ /* any enumerations */
{
/* additional values for enumeration */
},
/* any additional enumerations */
/* variant types are a special enumeration: */
{
/* additional types for variant */
},
/* any additional variants */
/* class and reference types are a special enumeration: */
{
},
/* any additional class or reference types */
}
}
}
请注意的是这是一个针对PS插件的aete资源模板,也就是说它不仅仅针对滤镜,也包括其他种类的PS插件。关于其具体含义这里我们不做详细讨论,可以参考相关PS SDK文档。
【注意】即使有的节不需要,也必须提供一个空的花括号占位,而不能有缺失。
下面我们给出添加了aete资源后的 FillRed.r 文件,内容如下:
// ADOBE SYSTEMS INCORPORATED
// Copyright 1993 - 2002 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this
// file in accordance with the terms of the Adobe license agreement
// accompanying it. If you have received this file from a source
// other than Adobe, then your use, modification, or distribution
// of it requires the prior written permission of Adobe.
//-------------------------------------------------------------------------------
#define plugInName "FillRed Filter"
#define plugInCopyrightYear "2009"
#define plugInDescription \
"FillRed Filter.\n\t - http:\\www.cnblogs.com\hoodlum1980"
#include "E:\Codes\Adobe Photoshop CS2 SDK\samplecode\common\includes\PIDefines.h"
#ifdef __PIMac__
#include "Types.r"
#include "SysTypes.r"
#include "PIGeneral.r"
#include "PIUtilities.r"
#include "DialogUtilities.r"
#include "CommonDefine.h" /* 包含了术语定义 */
#elif defined(__PIWin__)
#define Rez
#include "PIGeneral.h"
#include "E:\Codes\Adobe Photoshop CS2 SDK\samplecode\common\resources\PIUtilities.r"
#include "E:\Codes\Adobe Photoshop CS2 SDK\samplecode\common\resources\WinDialogUtils.r"
#include "CommonDefine.h" /* 包含了术语定义 */
#endif
#include "PITerminology.h"
#include "PIActions.h" /* 包含对 NO_REPLY 的定义 */
resource 'PiPL' ( 16000, "FillRed", purgeable )
{
{
Kind { Filter },
Name { plugInName },
Category { "Demo By hoodlum1980" },
Version { (latestFilterVersion << 16) 关键词:怎样编写一个Photoshop滤镜-- Scripting Plug-ins