2011-10-25 2 views
36

Devo usare ImageMagick poiché PIL non ha la quantità di funzionalità di immagine disponibile che sto cercando. Tuttavia, sto volendo usare Python.Posso accedere a ImageMagick API con Python?

I collegamenti Python (PythonMagick) non sono stati aggiornati dal 2009. L'unica cosa che sono riuscito a trovare sono le chiamate os.system per utilizzare l'interfaccia della riga di comando, ma questo sembra clunky.

C'è un modo per accedere direttamente all'API utilizzando ctypes e le conversioni di qualche tipo? Come ultima risorsa c'è qualche altra libreria là fuori che ha la vasta quantità di strumenti di modifica delle immagini come ImageMagick che ho visto?

risposta

57

Si consiglia di utilizzare Wand (le spiegazioni seguono).

ero alla ricerca di una corretta vincolante alla libreria ImageMagick, che sarebbe:

  • errore lavoro/senza problemi
  • essere mantenuta regolarmente e aggiornate
  • permettono bel Python obiettivo

Ma in effetti l'API python (binding) ha troppe versioni differenti (per lo più discontinue). Dopo aver letto una bella panoramica storica da Benjamin Schweizer è tutto chiaro (vedi anche il suo github wiki) :

  • GraphicsMagick
  • PythonMagick - prima implementazione
  • PythonMagickWand/Achim Domma - prima Wand - un CDLL implementazione
  • PythonMagickWand/Ian Stevens
  • MagickFoo - incluso nel python-MagickWand
  • Wand/Hong Minhee - l'ultimo progetto

Ora Wand è solo una (ridotta) API C per ImageMagick ".. L'API è l'interfaccia consigliata tra il linguaggio di programmazione C e le librerie di elaborazione immagini ImageMagick. A differenza dell'AP MagickCore C, MagickWand utilizza solo alcuni tipi opachi. Di accesso sono disponibili per impostare o ottenere importanti proprietà bacchetta."(See project homepage)

quindi è già un'interfaccia semplificata che è easer da mantenere.

+0

Sfortunatamente, il tuo link per Wand è rotto –

+0

fisso. molto –

0

ho trovato vincolante non va bene Python per ImageMagick, in modo da poter utilizzare ImageMagick in programma Python ho dovuto utilizzare il modulo subprocess per reindirizzare input/output

per esempio, supponiamo che abbiamo bisogno di convertire file PDF in TIF:.

path = "/path/to/some.pdf" 
cmd = ["convert", "-monochrome", "-compress", "lzw", path, "tif:-"] 
fconvert = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = fconvert.communicate() 
assert fconvert.returncode == 0, stderr 

# now stdout is TIF image. let's load it with OpenCV 
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8) 
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE) 

Qui ho usato tif:- per dire all'utility della riga di comando di ImageMagick che voglio ottenere l'immagine TIF come flusso stdout. Allo stesso modo si potrebbe dire di usare stdin stream come input specificando - come nome file di input.

-1

Questo ha funzionato per me per il seguente comando per creare un'immagine da un testo per la lettera "P":

import subprocess 

cmd = '/usr/local/bin/convert -size 30x40 xc:white -fill white -fill black -font Arial -pointsize 40 -gravity South -draw "text 0,0 \'P\'" /Users/fred/desktop/draw_text2.gif' 

subprocess.call(cmd, shell=True)