Могу ли я получить доступ к ImageMagick API с помощью Python? - PullRequest
45 голосов
/ 26 октября 2011

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

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

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

Ответы [ 3 ]

64 голосов
/ 26 июля 2012

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

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

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

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

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

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

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

3 голосов
/ 31 октября 2017

Я не нашел хорошей привязки 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's load it with OpenCV
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8)
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE)

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

0 голосов
/ 31 октября 2017

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