python - 使用 Python 自动化简单的 Photoshop
问题描述
我工作的企业创建激光雕刻的定制产品。雕刻机要求文件为 psd 格式。我们的网站使用户能够选择模板并输入他们想要的文本。订购后,我们的一位工作人员在 GIMP/Photoshop 中打开模板,切换文本,然后保存并上传。看起来很简单,但是当你每天做数百个这样的事情时,似乎值得自动化。
我说的主要语言是 python,但我已经涉足了足够多的其他语言,以至于我可以做一些小项目。我看到那里有一些不同的 PSD/photoshop 模块(pywin32、pyps、psd-tools),但要么没有足够的文档,要么它们似乎不适合我的目的。更详细地说,唯一需要做的是添加一个文本层,我们可以在其中选择字体、位置,最好选择是否加粗、斜体等,但这不是必需的。我有一个可以制作文本层的解决方案(通过 win32com),但我找不到如何编辑文本的不同元素。
import win32com.client
# Pieced together from
# http://techarttiki.blogspot.com/2008/08/photoshop-scripting-with-python.html
# and
# http://rubypane.blogspot.com/2013/01/sample-python-script-to-control.html
psApp = win32com.client.Dispatch("Photoshop.Application")
psApp.Open(r"C:\temp\blah.psd") # Opens a PSD file
doc = psApp.Application.ActiveDocument # Get active document object
layer = doc.ArtLayers[2] # Get the bottom-most layer
layers = doc.artLayers
artLayerRef = layers.add
artLayerRef.kind = 2 #Text layer
# Set the contents of the text layer.
textItemRef = artLayerRef.TextItem
textItemRef.Contents = "Hello, web!"
doc.Save()
该代码片段生成一个小文本框,没有任何格式显示“Hello World!”。同样,我希望能够控制它的位置、字体,如果可能的话,还可以控制它的其他元素。我也对其他解决方案持开放态度,无论是以另一种格式创建图片然后将其转换为 psd,使用另一种模块/语言,还是您聪明的头脑能想到的任何其他解决方案。最坏的情况,我们继续手动进行。感谢您的任何帮助!
解决方案
您可以尝试使用该软件包photoshop_python_api
。
https://github.com/loonghao/photoshop_python_api
Hello World
对于这个包。
import photoshop as ps
def hello_world():
app = ps.Application()
doc = app.documents.add()
text_color = ps.SolidColor()
text_color.rgb.green = 255
new_text_layer = doc.artLayers.add()
new_text_layer.kind = ps.LayerKind.TextLayer
new_text_layer.textItem.contents = 'Hello, World!'
new_text_layer.textItem.position = [160, 167]
new_text_layer.textItem.size = 40
new_text_layer.textItem.color = text_color
options = ps.JPEGSaveOptions(quality=5)
jpg = 'd:/hello_world.jpg'
doc.saveAs(jpg, options, asCopy=True)
app.doJavaScript(f'alert("save to jpg: {jpg}")')
if __name__ == '__main__':
hello_world()
更多示例:
https://photoshop-python-api.readthedocs.io/en/master/examples.html
推荐阅读
- c# - 有什么方法可以关联两种类型以允许泛型方法根据输入参数的类型返回相关类型
- ios - 在大多数 iOS 设备上运行 Flutter 应用程序时出现问题
- camunda - 如何在camunda中跳过并行分支
- reactjs - 如何检测浏览器选项卡切换时的反应状态变化?
- r - 如何在 R 中绘制重叠时间序列
- javascript - 访问 JSON 的元素返回 undefined
- javascript - 使用嵌套属性过滤带有集合和映射的 json
- azure - Xamarin 的 WindowsAzure.Storage 库是否使用 NSUrlSession 进行文件上传?
- php - Laravel return 有很多关系
- powershell - Powershell 中带有 COM 对象的垃圾收集