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?
Je recommanderais d'utiliser Wand (les explications suivent).
Je cherchais une liaison appropriée à la bibliothèque ImageMagick, qui:
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 ):
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.
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.
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)