Automating Adobe Photoshop {work in progress}Contents Sources of information Quick reference How do I? Quick reference The Photoshop type library exposes the following interfaces (and their dispinterface equivalents): IAction IActions IActionControl IActionDescriptor IActionList IActionReference IAutoPSDoc IPhotoshopApplicationAs you can see, Photoshop automation revolves around Actions. You can easily automate something by creating it as an Action in Photoshop, then playing it from Delphi using the IAction.Play or IPhotoshopApplication.PlayAction methods. IPhotoshopApplication - major methods and properties function Open(const fileName: WideString): IAutoPSDoc; function PlayAction(const fileName: WideString): WordBool; procedure Quit; function MakeControlObject: IActionControl; function MakeDescriptor: IActionDescriptor; function MakeList: IActionList; function MakeReference: IActionReference; property Actions: IActions read Get_Actions; property FullName: WideString read Get_FullName; property Visible: WordBool read Get_Visible write Set_Visible;IAction - methods and properties procedure Play; safecall; function Get_name: WideString; property name: WideString read Get_name; IActions - methods and properties function Get_count: Integer; function Get_Item(index: Integer): IAction; function Get__NewEnum: IUnknown;
property count: Integer read Get_count; property Item[index: Integer]: IAction read Get_Item; default; property _NewEnum: IUnknown read Get__NewEnum;Back to top --------------------------------------------------------------------------------IActionControl - methods function Play(eventID: Integer; const parameters: IActionDescriptor; dialogOptions: Integer): IActionDescriptor; procedure GetActionProperty(const reference: IActionReference; out propertyDesc: IActionDescriptor); procedure StringIDToTypeID(const stringID: WideString; out typeID: Integer); procedure TypeIDToStringID(typeID: Integer; out stringID: WideString);>>>>>How to start PhotoShop<<<<< uses ComObj, ActiveX, PhotoShopTypeLibrary_TLB;var PS: IPhotoShopApplication; AppWasRunning: boolean; Unknown: IUnknown; begin AppWasRunning := False; Result := GetActiveObject(CLASS_PhotoshopApplication, nil, Unknown); if (Result = MK_E_UNAVAILABLE) then PS := CoPhotoshopApplication.Create else begin { make sure no other error occurred during GetActiveObject } OleCheck(Result); OleCheck(Unknown.QueryInterface(IPhotoShopApplication, PS)); AppWasRunning := True; end; PS.Visible := True; Or, with late binding: PS := CreateOleObject('Photoshop.Application'); PS.Visible := True;Back to 'HowDoI' -------------------------------------------------------------------------------->>>>>How to close Photoshop<<<<< If PS is your Photoshop application variable: PS.Quit;
如果你们买了正版的photoshop7,肯定会有技术支持的,可以问他们有什么接口。
我们公司与正版的DELPHI6和8 ,不过BORLAN说中国不提供技术支持,真郁闷
我也知道photoshop有个录制功能,可以将你的操作录制成一个宏然后重复运行,可是我没看到老外的程序有录制这一步,是拿过来直接跑的
pl5th2001(白牙) :
考虑过正版和盗版的区别,不过正版到底比盗版支持哪些你能告诉我吗?我怕就怕让老板买了正版还是没戏就糗大了,有谁用过adobe的正版吗?
程序自己打开了photoshop7.0,然后,以我刚才看见的但是快几十倍的流程处理一个个图片,最后关闭了photoshop。==============================================================
这不是脱了裤子放屁——费两道手续吗?你们的客户真是吃饱了撑的反正到要设置,直接就用photoshop不就完了?
{work in progress}Contents
Sources of information
Quick reference
How do I? Quick reference
The Photoshop type library exposes the following interfaces (and their dispinterface equivalents): IAction
IActions
IActionControl
IActionDescriptor
IActionList
IActionReference
IAutoPSDoc
IPhotoshopApplicationAs you can see, Photoshop automation revolves around Actions. You can easily automate something by creating it as an Action in Photoshop, then playing it from Delphi using the IAction.Play or IPhotoshopApplication.PlayAction methods. IPhotoshopApplication - major methods and properties
function Open(const fileName: WideString): IAutoPSDoc;
function PlayAction(const fileName: WideString): WordBool; procedure Quit; function MakeControlObject: IActionControl;
function MakeDescriptor: IActionDescriptor;
function MakeList: IActionList;
function MakeReference: IActionReference;
property Actions: IActions read Get_Actions;
property FullName: WideString read Get_FullName;
property Visible: WordBool read Get_Visible write Set_Visible;IAction - methods and properties
procedure Play; safecall;
function Get_name: WideString;
property name: WideString read Get_name;
IActions - methods and properties
function Get_count: Integer;
function Get_Item(index: Integer): IAction;
function Get__NewEnum: IUnknown;
property count: Integer read Get_count;
property Item[index: Integer]: IAction read Get_Item; default;
property _NewEnum: IUnknown read Get__NewEnum;Back to top --------------------------------------------------------------------------------IActionControl - methods
function Play(eventID: Integer;
const parameters: IActionDescriptor;
dialogOptions: Integer): IActionDescriptor;
procedure GetActionProperty(const reference: IActionReference;
out propertyDesc: IActionDescriptor);
procedure StringIDToTypeID(const stringID: WideString; out typeID: Integer);
procedure TypeIDToStringID(typeID: Integer; out stringID: WideString);>>>>>How to start PhotoShop<<<<<
uses ComObj, ActiveX, PhotoShopTypeLibrary_TLB;var
PS: IPhotoShopApplication;
AppWasRunning: boolean;
Unknown: IUnknown;
begin
AppWasRunning := False;
Result := GetActiveObject(CLASS_PhotoshopApplication, nil, Unknown);
if (Result = MK_E_UNAVAILABLE) then
PS := CoPhotoshopApplication.Create
else begin
{ make sure no other error occurred during GetActiveObject }
OleCheck(Result);
OleCheck(Unknown.QueryInterface(IPhotoShopApplication, PS));
AppWasRunning := True;
end;
PS.Visible := True; Or, with late binding: PS := CreateOleObject('Photoshop.Application');
PS.Visible := True;Back to 'HowDoI' -------------------------------------------------------------------------------->>>>>How to close Photoshop<<<<<
If PS is your Photoshop application variable: PS.Quit;
你给的链接打不开了
PhotoShop和Acrobat都有SDK的,Acrobat reader的好像是可以下载的,PS的需要花钱买。
到这里看一下~~~~~
但愿周一会得到一个惊喜……
thanks all
但愿周一会得到一个惊喜……
thanks all
http://partners.adobe.com/public/developer/photoshop/devcenter.html
觉得使用这些接口不难的,主要是具体完成什么样的事。。
就是HOOK呀。
你记录一下客户单个文件处理的全部键盘动作,包括 ALT / UPARROW / CTRL+A / ENTER , ETC , 然后用 Windows API 按消息序列发送出去,就是调用 Sendmessage 到 Photoshop 的窗口(可以预先按 Window Title 取到它的句柄,定向发送消息即可)。
这样对于预先设定操作流程的外部程序全都可以强制驱动。
建立一个数据记录要发射的键盘指令,捕获窗口句柄,然后建立循环并按顺序对窗口发送出去。核心程序很短,数10行不到,明白了么?我以前用它实现过别的功能,祝您好运!
如果想模拟鼠标操作动作,需要调用的 API 还是那个 Sendmessage ,只不过这次换成消息类型是 WM_LBUTTONDOWN ,后面的参数队列挂上坐标记录结构即可。
所有基于 Windows 的的系统操作都是从消息循环响应着手的, Sendmessage 就是往 Windows 桌面的主消息循环泵里打入我们自定义的消息,如此而已。
不过我估计楼主不是很需要追踪鼠标操作信息,看他那个说法也就是调用 Photoshop 转换一下图片格式而已,全键盘操作可以搞定的话,自然就不要考虑鼠标消息跟踪了。
楼主实现以后要记得告诉一下大家啊,呵呵 ^&^
第二:david_zl(风中追风),意思我比较赞同。只是(Photoshop 转换一下图片格式而已,全键盘操作可以搞定的话,自然就不要考虑鼠标消息跟踪了。)我想可能也就这些吧,要是老外的东西是这样的话。我们可以进步点才得行哟,要只完成这样的功能,还要Photoshop 来做干啥子???????????????
Adobe Photoshop Elements Mac & Win
用SDK的话一般不用打开程序的界面
做好一个action,点一下旁边的菜单,选batch,选个目录,
目录下的文件就全部照action自动处理一遍了。
演示给他们看,说是你做的就可以了,
同时把他们总部的程序仍出窗外,
告诉客户他们这样干已经是乡下人了。
至于模拟键盘输入控制photoshop后台运行,
也是n年前就有人做了,去搜索下吧,
多上网搜索,什么年代了,
不要随便对人说不可以,
网络什么都能干。
密码来了没用的,要下载的话需要他们的什么什么服务,从399$/y到999$/y不等。我昨天用edonkey下载了一个acrobat 7的SDK。还没安装,居然不支持2003,NND。
原来注册了也不能下载啊~~~其实如果有SDK这个问题就非常简单了
记得去年向MacroMedia要FlashPlayer的源代码,人家还很客气地回信说:“我们认为你不需要源代码......如果你坚持认为自己符合获取源代码的条件,请Mail to...”
Adobe态度太差了,再说,SDK为什么还要收钱?小家子气~~~
我是没看到他们给你演示的程序是什么样子的,你的描述我也看的有些模糊。不过就像楼上那么多人说的,要么SDK,要么鼠标模拟。不过应该都不难!首先不要自己把自己吓倒了:)
PS里面把动作录成action
然后用Sendkey模拟键盘就搞定(这个函数能下载到),模拟过程中要屏蔽键盘输入..
感谢这么多朋友的支持和帮助,我感觉老外的程序和大家说的还不大一样:
david_zl(风中追风):我现在找到一个方法能像老外的程序一样处理photoshop,就是事先将操作录制一个宏,然后通过我的程序调用photoshop(winexec),激活photoshop窗口为当前窗口后向它发模拟按键消息,但是老外的程序不是这样实现的,它是可以从后台运行的,就是说,你可以在跑老外程序的同时干其他工作而不必让photoshop窗口作为当前窗口!看来他们的确是通过和photoshop内部通信实现的了,我想明白的就是通过哪种方式、如何通信的,请高手指教!是不是像pl5th2001(白牙)说的需要买正版才能得到相关接口呢?有知道的请进来一下,多谢了!
我的想法:
PS里面把动作录成action
然后用Sendkey模拟键盘就搞定(这个函数能下载到),模拟过程中要屏蔽键盘输入..
---------------------------------------------------------------------------------
我暂时就是这么实现的,但老外的不是
要实现后台运行效果,还有一种方法是使用 DDE 调用,但这需要知道 Photoshop DDE 通信参数接口
非正版也会有接口的,不要害怕^&^
感谢这么多朋友的支持和帮助,我感觉老外的程序和大家说的还不大一样:
我现在找到一个方法能像老外的程序一样处理photoshop,就是事先将操作录制一个宏,然后通过我的程序调用photoshop(winexec),激活photoshop窗口为当前窗口后向它发模拟按键消息,但是老外的程序不是这样实现的,它是可以从后台运行的,就是说,你可以在跑老外程序的同时干其他工作而不必让photoshop窗口作为当前窗口!看来他们的确是通过和photoshop内部通信实现的了,我想明白的就是通过哪种方式、如何通信的,请高手指教!是不是像pl5th2001(白牙)说的需要买正版才能得到相关接口呢?有知道的请进来一下,多谢了!
其它的例子你自己上网随意搜索,很多了。
还是没明白你说的应用是什么,不过我想最正规的办法还是上他的网站Down一个SDK下来,随便做做,该实现的功能应该就有了。感觉以你现在的实力,走偏门去解剖人家的软件,速度会很慢的,祝你好运。 ^&^
而且现在SDK好像都不是那么容易down的,呵呵
如果能下到 SDK ,不妨和大家共享一下,可以帮你再看看。 :)
我记得PS都是有Filter(滤镜)这么一说的吧?Filter有他的标准,我猜想应该是个标准的COM。
可以QueryInterface到接口完成具体的功能。
刚刚查看了安装目录下的文件,Plug-in目录:
*.8B_ 这样的文件,他们的文件头都有MZ this program cannot be run in DOS mode.
初步断定他们应该是COM, 至于他们制订的什么标准就不得而知了:)
楼主自己找,+U!
我不懂Photoshop,不过,如果操作完全可以通过键盘操作来进行的话,就不需要pohotoshop作为激活窗口显示啊,只要把键盘消息post给他就可以了,你先这么做一个出来给用户看,松口气再仔细研究嘛。
-------------------------------------------------------
有道理,多谢!
BTW:api spy类的程序能查看调用的所有的系统函数的参数值和函数的返回值,这些函数可以是系统DLL中定义的
http://community.csdn.net/Expert/topic/3913/3913625.xml?temp=1.710147E-02