Photoshop COM 是指通过 COM(Component Object Model,组件对象模型) 技术与 Adobe Photoshop 软件进行交互和控制。Adobe Photoshop 提供了一个自动化接口,开发者可以通过这个接口使用脚本或编程语言(如 VBA、VBScript、Python、C# 等)来控制 Photoshop,实现自动化操作和功能扩展。
Photoshop COM 通常由 Adobe Photoshop 的脚本引擎或自动化插件支持,用于调用 Photoshop 的功能,比如打开文件、执行滤镜、操作图层、导出文件等。
PhotoShop By 虚荣.ahk
#SingleInstance, force
ps := Photoshop.Init()
doc := ps.NewDoc()
ps.ExecJs("alert('hello world')")
alText := doc.NewAl("psTextLayer")
;msgbox, % alText.kind
alText.Size := 27
alText.Font := "MicrosoftYaHei"
loop, parse, % s, `n, `r
{
alText.Text := A_loopField
outfile := A_ScriptDir "\output\" A_Now A_MSec ".png"
if (A_Index = 1)
alText.MoveRel(0, 50)
doc.SaveAs(outfile)
}
keywait, numpad0, D
doc.close("不保存更改")
return
class PSError
{
__Call(params*) {
msgbox, % params[1]
; if (this.OnInit or (params[1] = "OnInit"))
; return
; throw this.__Class "无有" . params[1]
}
__Get(params*) {
msgbox, % params[1]
; if (this.OnInit or (params[1] = "OnInit"))
; return
; throw this.__Class "无有" . params[1]
}
}
class Photoshop extends PSError
{
static _PS := ""
static _COM_True := ComObject(0xb, -1, 1)
static _COM_False := ComObject(0xb, 0, 1)
Init() {
this._PS := ComObjCreate("Photoshop.Application")
return this
}
GetFontList()
{
ret := []
loop, % this._PS.Fonts.Count
;~ 参数从1起
ret.push(this._PS.Fonts.Item(A_Index).PostScriptName)
return ret
}
GetFontList2Clipboard()
{
ret := ""
for _, fontName in this.GetFontList()
ret .= fontName "`n"
Clipboard := ret
}
;----------------------------------------------
;~ 获取当前打开的文档的数量
DocCount {
get {
return this._PS.Documents.Count
}
}
;~ 打开一张图片到文档
OpenFile(imgPath) {
this._PS.Open(imgPath)
}
;~ 获取当前激活的文档工程
ActiveDoc()
{
return new Photoshop_Document(this._PS.ActiveDocument)
}
;~ 获取已经打开的ps文档工程
GetDoc(index)
{
return new Photoshop_Document(this._Ps.Documents.Item(index))
}
;~ 新建一个ps文档工程
NewDoc(width := 800, height := 300) {
static unit := {"像素": 1, "英寸":2,"厘米": 3, "毫米": 4, "点":5, "派卡":6, "百分之": 7}
this._PS.Preferences.RulerUnits := 1 ;度量单位[单位]
return new Photoshop_Document(this._PS.Documents.Add(width, height))
}
ExecJs(js)
{
return this._ps.DoJavaScript(js)
}
}
class Photoshop_Document extends PsError ;~ app.Documents 对象
{
__New(doc)
{
this.OnInit := true
this._doc := doc
this.OnInit := False
}
;~ 返回ps对象
App {
get {
return Photoshop
}
}
;~ 尺寸
Width {
get {
return this._doc.Width
}
set {
this._doc.Width := value
}
}
Height {
get {
return this._doc.Height
}
set {
this._doc.Height := value
}
}
;~ 文档路径
Path {
get {
return this._doc.Path
}
}
AlCount {
get {
return this._doc.ArtLayers.Count
}
}
;~ 获取或创建图层
GetAlByName(name)
{
loop, % this.AlCount
{
al := this.GetAlByIndex(A_Index)
if (al.Name == name)
return al
}
return ""
}
GetAlByIndex(index)
{
return this._doc.ArtLayers.Item(index)
}
NewAl(kind := "psNormalLayer")
{
return Photoshop_ArtLayer.Factory(this, kind)
}
;~
Close(option)
{
static SaveOption := { "psSaveChanges": 1 ;` 保存所有更改
,"保存更改": 1
,"psDoNotSaveChanges": 2 ;~ 不保存任何更改
,"不保存更改":2
,"psPromptToSaveChanges":3
,"提示更改":3} ;~ 显示提示保存
this._doc.Close(SaveOption[option])
}
;~ 保存
Save()
{
this._doc.Save()
}
;~ 保存到
SaveAs(filePath)
{
filePath := strReplace(filePath, "\", "\\")
js =
(
var pngFile = new File('%filePath%');
pngSaveOption = new PNGSaveOptions();
pngSaveOption.compression = 0;
pngSaveOption.interlaced = false;
activeDocument.saveAs(pngFile, pngSaveOption, true, Extension.LOWERCASE)
)
this.App.ExecJs(js)
}
}
class Photoshop_ArtLayer extends PsError
{
static LayerKindDict := { "psNormalLayer": 1
,"psTextLayer":2
,"psSolidFillLayer":3
,"psGradientFillLayer":4
,"psPatternfillLayer":5
,"psLevelLayer":6
,"psCurvesLayer":7
,"psColorBalanceLayer":8
,"psBrightnessContrastLayer":9
,"psHueSaturationLayer":10
,"psSelectiveColorLayer":11
,"psChannelMixerLayer":12
,"psGradientMapLayer":13
,"psInversionLayer":14
,"psThresholdLayer":15
,"psPosterizeLayer":16
,"psSmartObjectLayer":17
,"psPhotoFilterLayer":18
,"psExposureLayer":19
,"psLayer3D":20
,"psVideoLayer":21
,"psBlackAndWhiteLayer":22
,"psVibrance":23}
Factory(doc, kind := "psNormalLayer")
{
if not this.LayerKindDict.HasKey(kind)
throw "此图层类型不存在: " kind
cls := "Photoshop_" kind
if IsObject(%cls%) {
al := doc._doc.ArtLayers.Add
al.kind := this.LayerKindDict[kind]
return new %cls%(al)
}
else
{
al := doc._doc.ArtLayers.Add
al.kind := this.LayerKindDict[kind]
return new Photoshop_Layer(al)
}
}
__New(al)
{
this.OnInit := true
this._al := al
this.OnInit := False
}
TypeName
{
get {
return this._al.typename
}
}
Name {
get {
return this._al.Name
}
set {
this._al.Name := value
}
}
Kind {
get {
return this._al.Kind
}
}
;~ 是否隐藏
Visible {
get {
return this._al.Visible
}
set {
value := (value) ? -1 : 0
this._al.Visible := (value) ? Photoshop._COM_True : Photoshop._COM_False
;DllCall("oleaut32\SafeArrayUnaccessData", "ptr", _comarr)
}
}
Doc {
get {
return new Photoshop_Document(this._al.Parent)
}
}
App {
get {
return PhotoShop
}
}
不透明度 { ;~ 双精度浮点
get {
return this._al.Opacity
}
set {
this._al.Opacity := value
}
}
MoveRel(x, y) ;~ 双精度浮点数
{
this._al.TransLate(x, y)
}
}
class Photoshop_psTextLayer extends Photoshop_ArtLayer
{
__New(al)
{
this.OnInit := true
this._al := al
this.OnInit := False
}
Font { ;~ 字体
get {
return this._al.TextItem.Font
}
set {
this._al.TextItem.Font := value
}
}
Text { ;~ 文本内容
get {
return this._al.TextItem.Contents
}
set {
this._al.TextItem.Contents := value
}
}
Size { ;~ 字号
get {
return this._al.TextItem.Size
}
set {
this._al.TextItem.Size := value
}
}
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)