首页 > 解决方案 > 使用 python win32com.client 在 Photoshop 中移动图层

问题描述

我一直在使用移动层功能,在 python 中编写一个 Photoshop 脚本。图层最终位于其他图层集内,而不是在它们之后,等等。

在 Photoshop 的 Javascript 中执行此操作的本机命令是:

layer.move(relativeObject, insertionLocation)

其中 insertLocation 可以是:

ElementPlacement.INSIDE、ElementPlacement.PLACEATBEGINNING、ElementPlacement.PLACEATEND、ElementPlacement.PLACEBEFORE 或 ElementPlacement.PLACEAFTER

我当前的代码如下所示:

@staticmethod
def moveLayer(layer, relativeLayer = None, placement = 3):
    if placement == PHAPS.ElementPlacementPLACEATEND:
        layers = PHAPS.app().ActiveDocument.layers
        relativeLayer = layers[len(layers) - 1]
        placement = PHAPS.ElementPlacementPLACEAFTER
    elif placement == PHAPS.ElementPlacementPLACEATBEGINNING:
        relativeLayer = PHAPS.app().ActiveDocument.layers[0]
        placement = PHAPS.ElementPlacementPLACEBEFORE
    layer.Move(relativeLayer, placement)

这是我对常数值的猜测,显然是错误的:

ElementPlacementPLACEATBEGINNING = 1
ElementPlacementINSIDE = 2
ElementPlacementPLACEBEFORE = 3
ElementPlacementPLACEAFTER = 4
ElementPlacementPLACEATEND = 5

我尝试过跟踪这些常量的原生值,但 Photoshop 很好地隐藏了这些常量。我也尝试过 Action Manager 代码,但我发现它有点难以理解。

有谁知道用python在photoshop中移动图层的可靠方法?首选操作管理器代码,但不是必需的。

标签: pythonpython-3.xphotoshopphotoshop-script

解决方案


嗨,您可以使用这些方法代替 .Move()

def MoveAfter(self, RelativeObject=defaultNamedNotOptArg):
    'Move the PageItem in behind object'
    return self._oleobj_.InvokeTypes(1299596641, LCID, 1, (24, 0), ((9, 1),),RelativeObject
        )

def MoveBefore(self, RelativeObject=defaultNamedNotOptArg):
    'Move the PageItem in front of object'
    return self._oleobj_.InvokeTypes(1299596642, LCID, 1, (24, 0), ((9, 1),),RelativeObject
        )

def MoveToBeginning(self, Container=defaultNamedNotOptArg):
    'Move the PageItem to beginning of container'
    return self._oleobj_.InvokeTypes(1299596646, LCID, 1, (24, 0), ((9, 1),),Container
        )

def MoveToEnd(self, Container=defaultNamedNotOptArg):
    'Move the PageItem to end of container'
    return self._oleobj_.InvokeTypes(1299596645, LCID, 1, (24, 0), ((9, 1),),Container

在哪里:

  • RelativeObject = 是相对图层参考
  • Container = 是图层所在的文档

例子

from win32com.client import Dispatch

app = Dispatch("Photoshop.Application")
doc = app.Open(r"hereTheProjectPath.psd")
layerRefA = doc.ArtLayers.Add()
layerRefA.MoveToEnd(doc)

layerRefB = doc.ArtLayers.Add()
layerRefB.MoveAfter(layerRefA)

推荐阅读