Как мне экспортировать PSD как PNG с py-appscript?
Я написал скрипт для экспорта PSD в формате PNG с помощью rb-appscript. Это хорошо и здорово, но я не могу справиться с этим в py-appscript.
Вот код рубина:
#!/usr/bin/env ruby
require 'rubygems'
require 'optparse'
require 'appscript'
ps = Appscript.app('Adobe Photoshop CS5.app')
finder = Appscript.app("Finder.app")
path = "/Users/nbaker/Desktop/"
ps.activate
ps.open(MacTypes::Alias.path("#{path}guy.psd"))
layerSets = ps.current_document.layer_sets.get
# iterate through all layers and hide them
ps.current_document.layers.get.each do |layer|
layer.visible.set false
end
layerSets.each do |layerSet|
layerSet.visible.set false
end
# iterate through all layerSets, make them visible, and create a PNG for them
layerSets.each do |layerSet|
name = layerSet.name.get
layerSet.visible.set true
ps.current_document.get.export(:in => "#{path}#{name}.png", :as => :save_for_web,
:with_options => {:web_format => :PNG, :png_eight => false})
layerSet.visible.set false
end
А вот явно неэквивалентный код Python:
from appscript import *
from mactypes import *
# fire up photoshop
ps = app("Adobe Photoshop CS5.app")
ps.activate()
# open the file for editing
path = "/Users/nbaker/Desktop/"
f = Alias(path + "guy.psd")
ps.open(f)
layerSets = ps.current_document.layer_sets()
# iterate through all layers and hide them
for layer in ps.current_document.layers():
layer.visible.set(False)
#... and layerSets
for layerSet in layerSets:
layerSet.visible.set(False)
# iterate through all layerSets, make them visible, and create a PNG for them
for layerSet in layerSets:
name = layerSet.name()
layerSet.Visible = True
ps.current_document.get().export(in_=Alias(path + name + ".png"), as_=k.save_for_web,
with_options={"web_format":k.PNG, "png_eight":False})
Единственная часть скрипта Python, которая не работает, - это сохранение. Я получил всевозможные ошибки, пытаясь разные варианты экспорта и прочее:
Соединение недействительно... Произошла общая ошибка Photoshop. Эта функция может быть недоступна в этой версии Photoshop... Не удается преобразовать некоторые данные в ожидаемый тип...
Я могу жить только с помощью сценария ruby, но все остальные наши сценарии написаны на python, поэтому было бы неплохо иметь возможность реализовать это на python. Заранее спасибо интернету.
1 ответ
Берт,
Я думаю, что у меня есть решение для вас - хотя несколько месяцев спустя. Обратите внимание, что я нуб Python, так что это ни в коем случае не элегантно.
Когда я опробовал твой сценарий, он продолжал рушиться и для меня. Однако, удалив "Псевдоним" в вызове экспорта, кажется, все в порядке:
from appscript import *
from mactypes import *
# fire up photoshop
ps = app("Adobe Photoshop CS5.1.app")
ps.activate()
# open the file for editing
path = "/Users/ian/Desktop/"
f = Alias(path + "Screen Shot 2011-10-13 at 11.48.51 AM.psd")
ps.open(f)
layerSets = ps.current_document.layer_sets()
# no need to iterate
ps.current_document.layers.visible.set(False)
ps.current_document.layer_sets.visible.set(False)
# iterate through all layerSets, make them visible, and create a PNG for them
for l in layerSets:
name = l.name()
# print l.name()
l.visible.set(True)
# make its layers visible too
l.layers.visible.set(True)
# f = open(path + name + ".png", "w").close()
ps.current_document.get().export(in_=(path + name + ".png"), as_=k.save_for_web,
with_options={"web_format":k.PNG, "png_eight":False})
Я также заметил, что вы перебираете все слои, чтобы переключать их видимость. На самом деле вы можете просто выполнить их все сразу - мое понимание состоит в том, что это быстрее, так как не нужно выпускать Apple Events.
Логика моего сценария неверна (в том, что касается включения и выключения слоев), но вы поняли идею.
Ян