关闭

VC++制作Photoshop自动化插件

728人阅读 评论(0) 收藏 举报
分类:
先感叹一番,Photoshop插件功能非常强大,并且SDK使用都超级简单,膜拜一下。官方SDK里提供的例子可以直接在Visual Studio 2010中编译通过。

本文使用环境如下:
1.开发环境:Visual Studio 2010
2.SDK:Adobe Photoshop CS5 SDK(下载地址:http://www.adobe.com/cn/devnet/photoshop.html)
3.测试环境:Win7 + Photoshop CS5

下载SDK后,解压到指定目录,如下图:
VC++制作Photoshop自动化插件
在SDK文件夹下找到 目录\pluginsdk\samplecode\automation下的listener插件目录,里面win目录下有sln文件,使用VS2010打开即可直接编译通过,生成完毕后,找到这个目录:\pluginsdk\samplecode\Output\Win\Debug,会有一个Listener.8li文件,扩展名为8li的文件,即是Photoshop自动化插件文件,将Listener.8li文件复制到Photoshop安装目录下的\Plug-ins\Automate文件夹内,重启Photoshop,选择菜单“文件”--“自动”在其子项里会出现“Listener”。如下图所示:
VC++制作Photoshop自动化插件

这个Listener只是PS众多插件之一而已...但它的功能是非常强大的,我们自己想要实现的插件,都要依靠于这个插件。下面介绍一下这个插件是干什么的:

Listener插件,不需要我们去主动执行它,这个插件可以自动捕获Photoshop中所有“常规”操作(注意:不是所有操作!),并给出对应操作在插件中实现所使用的代码!即便我们不去仔细研究SDK各个函数的用法及流程,依然可以写出功能强大的插件!基于这个插件,我们要想用插件实现自动化操作,只需要在Photoshop中操作一遍,便会自动生成一个Listener.log的文本文件,里面记录插件完成这个功能所使用的代码。

举个例子:我们打开Photoshop CS5,并打开一个图像文件,操作完成后,打开Listener.log文件,会有类似如下函数:
SPErr PlayeventOpen(void)
{
     PIActionDescriptor result = NULL;
     DescriptorTypeID runtimeKeyID;
     DescriptorTypeID runtimeTypeID;
     DescriptorTypeID runtimeObjID;
     DescriptorTypeID runtimeEnumID;
     DescriptorTypeID runtimeClassID;
     DescriptorTypeID runtimePropID;
     DescriptorTypeID runtimeUnitID;
     SPErr error = kSPNoError;
     // Move this to the top of the routine!
     PIActionDescriptor desc00000078 = NULL;

     error = sPSActionDescriptor->Make(&desc00000078);
     if (error) goto returnError;

     // Move this to the top of the routine!
     Handle aliasValue = NULL;
     FullPathToAlias("C:\Users\Administrator\Desktop\test\input\人像副本.png", aliasValue);
     error = sPSActionDescriptor->PutAlias(desc00000078, keyNull, aliasValue);
     if (error) goto returnError;

     error = sPSActionControl->Play(&result, eventOpen, desc00000078, plugInDialogSilent);
     if (error) goto returnError;

returnError:
     if (result != NULL) sPSActionDescriptor->Free(result);
     if (desc00000078 != NULL) sPSActionDescriptor->Free(desc00000078);
     if (aliasValue != NULL) sPSHandle->Dispose(aliasValue);
     return error;
}

这个示例函数,我们并不需要完全读懂每一个函数调用的含义(当然能读懂更好^_^)!我们发现
FullPathToAlias("C:\Users\Administrator\Desktop\test\input\人像副本.png", aliasValue);
这个函数的第一个函数是要打开的文件的路径,这个参数我们可以根据插件需要,动态来传递这个参数!

下面介绍另外一个插件:目录\pluginsdk\samplecode\automation下的Getter插件目录里面的win文件夹下有sln文件,可以用vs2010打开,我们所写的插件,可以基于这个工程来修改,这个插件原来也有自己的功能的,它也实现了一些操作的监视,不过我们暂时可以不用理它,就拿它来改造成我们的插件即可!

在Getter.cpp文件中找到
DLLExport SPAPI SPErr AutoPluginMain(const char* caller, const char* selector, void* message)
这个函数,这个是插件的入口函数,Photoshop调用插件的时候,最先调用插件内部的这个函数。其实所谓的photoshop 8li插件文件,不过是dll而已!

在入口点函数AutoPluginMain内,调用了函数DoIt(actionsMessage);我们把它注释掉,换成调用我们自己的函数,便把这个插件改造成我们自己需要的了!

下面我们完成一个具体的例子,要实现的功能是,调用插件,打开一个指定的文件。
1.将Listener.log文件中的PlayeventOpen函数,完整copy到Getter工程中Getter.cpp文件里(最好放在入口点函数之前,否则要加前置声明!)
2.将原来的
DoIt(actionsMessage);
注释掉,并改为
PlayeventOpen();
3.重新编译。
4.到SDK目录下\pluginsdk\samplecode\Output\Win\Debug里找到生成的Getter.8li,拷贝到Photoshop安装目录下的\Plug-ins\Automate文件夹内,重启PS(一定要重启!)
5.“文件”--“自动”--“Getter”,我们发现已经自动打开了那个图片。恭喜,一个最简单的PS插件,你已经做出来了!


最后注意一些开发技巧:
1.我们要想获取一个操作对应的实现函数时,先打开PS,操作到要获取操作对应函数之前,回到桌面,把原来的log文件删掉,回到PS,执行目标操作,执行完目标操作后不要进行其他的操作,打开log文件,这时里面几乎只有一个函数,就是刚刚我们执行目标操作所需要的函数。否则的话,log文件里有好多函数,不容易找到哪个函数是我们刚刚执行的操作了!因为有时一个操作可能对应多个函数!
2.PS菜单中显示的插件名称,并不是根据文件名来命名的,所以我们可以随便更改生成出来的Getter.8li这个文件的文件名,而不影响插件的真实名字。如果我们想修改PS中显示的插件名称,请在VS解决方案管理器中找到 GetterPiPL.r文件,打开
找到#define plugInName "Getter"
替换成#define plugInName "MyPluginName"
重新生成,插件在PS中的显示名就变成了“MyPluginName”了...


以上内容,本文作者仅对PS插件入门做讨论,如有错误之处,希望高手留言指正,以免误导其他开发人员。谢谢!  作者QQ:7278449,欢迎各位加我交流技术。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7308次
    • 积分:185
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论