web-dev-qa-db-fra.com

Puis-je accéder à l'API ImageMagick avec Python?

Je dois utiliser ImageMagick car PIL ne dispose pas du nombre de fonctionnalités d’image que je recherche. Cependant, je veux utiliser Python.

Les liaisons Python (PythonMagick) n'ont pas été mises à jour depuis 2009. La seule chose que j'ai pu trouver est l'appel os.system pour utiliser l'interface de ligne de commande, mais cela semble compliqué.

Existe-t-il un moyen d'accéder directement à l'API à l'aide de ctypes et de conversions? En dernier recours, existe-t-il une autre bibliothèque disposant de la quantité d'outils d'édition d'images telle que ImageMagick que j'ai examinée?

39
bsktball11ch

Je recommanderais d'utiliser Wand (les explications suivent).

Je cherchais une liaison appropriée à la bibliothèque ImageMagick, qui:

  • erreur de travail/sans problème
  • être régulièrement entretenu et à jour
  • permettre l'objectif de Nice en python

Mais en réalité, l'API python (liaison) a trop de versions différentes (la plupart du temps abandonnées). Après avoir lu un aperçu historique de Nice par Benjamin Schweizer, tout est devenu clair (voir aussi son github wiki ):

  • GraphicsMagick
  • PythonMagick - première implémentation 
  • PythonMagickWand/Achim Domma - première baguette magique - implémentation de CDLL
  • PythonMagickWand/Ian Stevens
  • MagickFoo - inclus dans python-magickwand
  • Wand/Hong Minhee - le dernier projet

Désormais, Wand n’est plus qu’une API C réduite à ImageMagick ".. L’API est l’interface recommandée entre le langage de programmation C et les bibliothèques de traitement d’images ImageMagick. pour définir ou obtenir des propriétés de baguette importantes ". ( Voir la page d'accueil du projet )

C'est donc déjà une interface simplifiée et plus facile à maintenir.

59
Yauhen Yakimovich

Je n'ai trouvé aucune bonne liaison Python pour ImageMagick, donc pour utiliser ImageMagick dans un programme Python, j'ai dû utiliser le module subprocess pour rediriger les entrées/sorties.

Par exemple, supposons que nous ayons besoin de convertir le fichier 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)

Ici, j'ai utilisé tif:- pour indiquer à l'utilitaire de ligne de commande d'ImageMagick que je souhaitais obtenir une image TIF en tant que flux stdout. De la même manière, vous pouvez lui dire d'utiliser le flux stdin en tant qu'entrée en spécifiant - en tant que nom de fichier d'entrée.

2
Maksym Ganenko

Cela a fonctionné pour moi pour la commande suivante pour créer une image à partir de texte pour la lettre "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)
0
fmw42