2011-10-25 18 views
36

Necesito usar ImageMagick ya que PIL no tiene la cantidad de funcionalidad de imagen disponible que estoy buscando. Sin embargo, quiero usar Python.¿Puedo acceder a la API de ImageMagick con Python?

Las vinculaciones de python (PythonMagick) no se han actualizado desde 2009. Lo único que he podido encontrar es os.system llamadas para utilizar la interfaz de línea de comandos, pero esto parece torpe.

¿Hay alguna manera de acceder a la API directamente usando ctypes y conversiones de algún tipo? Como último recurso, ¿hay alguna otra biblioteca que tenga la gran cantidad de herramientas de edición de imágenes como ImageMagick que he revisado?

Respuesta

57

Recomendaría usar Wand (las explicaciones son a continuación).

que estaba buscando adecuada de unión a la biblioteca ImageMagick, que sería:

  • error trabajo/sin problemas
  • un mantenimiento regular y actualizada
  • permiten agradable Python objetivo

Pero, de hecho, la API de Python (vinculante) tiene demasiadas versiones diferentes (en su mayoría descontinuadas). Después de leer una reseña histórica agradable por Benjamin Schweizer todo ha quedado claro (también ver a su github wiki) :

  • GraphicsMagick
  • PythonMagick - primera implementación
  • PythonMagickWand/Achim Domma - primera Wand - un CDLL aplicación
  • PythonMagickWand/Ian Stevens
  • MagickFoo - incluido en python-MagickWand
  • Wand/Hong Minhee - el último proyecto

Ahora Wand es solo una API C (reducida) para ImageMagick ".. API es la interfaz recomendada entre el lenguaje de programación C y las bibliotecas de procesamiento de imágenes ImageMagick. A diferencia de la API de MagickCore C, MagickWand utiliza solo algunos tipos opacos. Los descriptores de acceso están disponibles para establecer u obtener importantes propiedades varita."(See project homepage)

por lo que ya es una interfaz simplificada que es easer de mantener.

+0

Por desgracia, su vínculo con la vara se rompe –

+0

fijo. tx mucho –

0

he encontrado ninguna buena enlace de Python para ImageMagick, por lo que con el fin de utilizar ImageMagick en el programa de Python que tuvo que usar subprocess módulo para redirigir la entrada/salida

Por ejemplo, supongamos que necesitamos para convertir archivos PDF en 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) 

Aquí he utilizado tif:- para decirle a la utilidad de línea de comandos de ImageMagick que quiero obtener una imagen TIF como flujo estándar. De la misma manera, puede indicarle que use stdin stream como entrada especificando - como nombre de archivo de entrada.

-1

Esto ha funcionado para mí para el siguiente comando para crear una imagen de texto para la letra "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) 
Cuestiones relacionadas