2011-07-20 31 views
6

Tôi cần viết chương trình Python để tải hình ảnh photoshop PSD, có nhiều lớp và nhổ ra các tệp png (một cho mỗi lớp). Bạn có thể làm điều đó bằng Python không? Tôi đã thử PIL, nhưng dường như không có phương pháp nào để truy cập các lớp. Cứu giúp. PS. Việc viết trình tải PSD và trình soạn thảo png của riêng tôi đã cho thấy quá chậm.Lớp PSD Python?

Trả lời

5

Sử dụng GIMP-Python? http://www.gimp.org/docs/python/index.html

Bạn không cần Photoshop theo cách đó và nó sẽ hoạt động trên mọi nền tảng chạy GIMP và Python. Đó là một sự phụ thuộc lớn, nhưng một sự phụ thuộc miễn phí.

Đối với thực hiện nó trong PIL:

from PIL import Image, ImageSequence 
im = Image.open("spam.psd") 
layers = [frame.copy() for frame in ImageSequence.Iterator(im)] 

Edit: OK, tìm ra giải pháp: https://github.com/jerem/psdparse

này sẽ cho phép bạn trích xuất các lớp từ một file psd với python mà không cần bất kỳ công cụ phi python.

+0

+1 Đối với 'psdparse'! Có vẻ như OP không phải cuộn chức năng của riêng mình :) – rzetterberg

+0

psdparse không hoạt động. Lỗi "Số lượng kênh không được hỗ trợ" ... – Brock123

+1

Chúng tôi đã loại bỏ tất cả các tùy chọn ra khỏi đó, tôi tin. Bạn sẽ phải tự cuộn hoặc sử dụng GIMP-Python. – agf

2

Bạn có thể sử dụng win32com để truy cập Photoshop bằng Python. có thể mã giả cho công việc của bạn:

  1. tải file PSD
  2. Thu thập tất cả các lớp và làm cho tất cả các lớp VISIBLE = OFF
  3. Bật một lớp khác, đánh dấu chúng VISIBLE = ON và xuất khẩu sang PNG
 

    import win32com.client 
    pApp = win32com.client.Dispatch('Photoshop.Application') 

    def makeAllLayerInvisible(lyrs): 
     for ly in lyrs: 
      ly.Visible = False 

    def makeEachLayerVisibleAndExportToPNG(lyrs): 
     for ly in lyrs: 
      ly.Visible = True 
      options = win32com.client.Dispatch('Photoshop.PNGSaveOptions') 
      options.Interlaced = False 
      tf = 'PNG file name with path' 
      doc.SaveAs(SaveIn=tf,Options=options) 
      ly.Visible = False 

    #pApp.Open(PSD file) 
    doc = pApp.ActiveDocument 
    makeAllLayerInvisible(doc.Layers) 
    makeEachLayerVisibleAndExportToPNG(doc.Layers) 

1

Sử dụng các plugin win32com cho python (có sẵn ở đây: http://python.net/crew/mhammond/win32/) bạn có thể truy cập vào photoshop và dễ dàng đi qua lớp của bạn và xuất khẩu chúng.

Đây là mẫu mã hoạt động trên các lớp trong tài liệu Photoshop hiện đang hoạt động và xuất chúng vào thư mục được xác định trong 'save_location'.

from win32com.client.dynamic import Dispatch 

#Save location 
save_location = 'c:\\temp\\' 

#call photoshop 
psApp = Dispatch('Photoshop.Application') 

options = Dispatch('Photoshop.ExportOptionsSaveForWeb') 
options.Format = 13 # PNG 
options.PNG8 = False # Sets it to PNG-24 bit 

doc = psApp.activeDocument 

#Hide the layers so that they don't get in the way when exporting 
for layer in doc.layers: 
    layer.Visible = False 

#Now go through one at a time and export each layer 
for layer in doc.layers: 

    #build the filename 
    savefile = save_location + layer.name + '.png' 

    print 'Exporting', savefile 

    #Set the current layer to be visible   
    layer.visible = True 

    #Export the layer 
    doc.Export(ExportIn=savefile, ExportAs=2, Options=options) 

    #Set the layer to be invisible to make way for the next one 
    layer.visible = False