2011-07-20 7 views
6

Potrzebuję napisać program w języku Python do ładowania obrazu PSD, który ma wiele warstw i wypluwa pliki png (po jednym dla każdej warstwy). Czy możesz to zrobić w Pythonie? Próbowałem PIL, ale wydaje się, że nie ma żadnej metody dostępu do warstw. Wsparcie. PS. Pisanie własnego programu ładującego PSD i programu png okazało się zbyt powolne.Python PSD layers?

Odpowiedz

5

Użyj Gimp-Python? http://www.gimp.org/docs/python/index.html

Nie potrzebujesz programu Photoshop w ten sposób i powinien działać na każdej platformie, na której działają Gimp i Python. To duża zależność, ale bezpłatna.

Dla robi to w PIL:

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

Edit: Ok, znalazłem rozwiązanie: https://github.com/jerem/psdparse

pozwoli wyodrębnić warstwy z pliku PSD z pytona bez non-python rzeczy.

+0

+1 Dla 'psdparse'! Wygląda na to, że OP nie musi uruchamiać swojej własnej funkcjonalności :) – rzetterberg

+0

psdparse nie działa. Błąd "Nieobsługiwana liczba kanałów" ... – Brock123

+1

Wydaje się, że wyewidencjonowaliśmy wszystkie opcje. Musisz albo rzucić własną, albo użyć Gimp-Pythona. – agf

2

Możesz użyć win32com do uzyskania dostępu do Photoshopa za pomocą Pythona. Możliwa pseudo kod do pracy:

  1. Załaduj PSD
  2. Zbierz wszystkie warstwy i uczynić wszystkie warstwy Visible = OFF
  3. Włącz jedną warstwę po drugiej, oznaczyć je Visible = ON i eksport do 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

Używanie wtyczki win32com dla Pythona (dostępny tutaj: http://python.net/crew/mhammond/win32/) można uzyskać dostęp do Photoshopa i łatwo przejść przez warstwy i eksportować je.

Oto przykład kodu, który działa na warstwach w ramach aktualnie aktywnego dokumentu programu Photoshop i eksportuje je do folderu zdefiniowanego w "lokalizacja_oszczędności".

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