Могу ли я получить доступ к API ImageMagick с помощью Python?

Мне нужно использовать ImageMagick, поскольку у PIL нет количества доступных функций изображения, которые я ищу, Тем не менее, я хочу использовать Python.

Связывание python (PythonMagick) не обновлялось с 2009 года. Единственное, что мне удалось найти, это вызов os.system для использования интерфейса командной строки, но это кажется неуклюжим.

Есть ли способ прямого доступа к API с помощью ctypes и каких-то преобразований? В крайнем случае есть ли какая-либо другая библиотека, в которой есть обширное количество инструментов для редактирования изображений, таких как ImageMagick, которые я просмотрел?

Ответ 1

Я бы рекомендовал использовать Wand (объяснения следует).

Я искал правильную привязку к библиотеке ImageMagick, которая:

  • ошибка работы/проблема бесплатно
  • регулярно поддерживать и обновлять
  • разрешить хороший объектный Python

Но в действительности API (привязка) python имеет слишком много разных (в основном прекращенных) версий. Прочитав хороший исторический обзор Бенджамина Швейзера, все стало ясно (также см. Его github wiki):

  • GraphicsMagick
  • PythonMagick - первая реализация
  • PythonMagickWand/Achim Domma - первая Wand - реализация CDLL
  • PythonMagickWand/Ian Stevens
  • MagickFoo - включен в python-magickwand
  • Wand/Hong Minhee - последний проект

Теперь Wand - это просто (сокращенный) API C для ImageMagick ".. API - это рекомендуемый интерфейс между языком программирования C и библиотеками обработки изображений ImageMagick. В отличие от API MagickCore C, MagickWand использует только несколько непрозрачных типов. Аксессуры доступны для установки или получения важных свойств палочки". (См. домашнюю страницу проекта)

Таким образом, это уже упрощенный интерфейс, который легче поддерживать.

Ответ 2

Я не нашел хорошей привязки Python для ImageMagick, поэтому для использования ImageMagick в программе Python мне пришлось использовать модуль subprocess для перенаправления ввода/вывода.

Например, предположим, что нам нужно преобразовать PDF файл в 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 load it with OpenCV
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8)
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE)

Здесь я использовал tif:-, чтобы сообщить утилите командной строки ImageMagick, что я хочу получить изображение TIF как поток stdout. Аналогичным образом вы можете указать ему использовать поток stdin в качестве ввода, указав - в качестве входного имени файла.

Ответ 3

Это сработало для меня для следующей команды для создания изображения из текста для буквы "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)