Монтаж с использованием PythonMagick в Python 3? - PullRequest
3 голосов
/ 20 февраля 2012

Я надеялся, что мне удастся создать монтаж с помощью PythonMagick. Документация кажется очень скудной, но я пытался выследить ее, используя, по крайней мере, часть Eclipse для завершения кода, а также несколько других вопросов здесь по поводу переполнения стека. Похоже, что MagickWand API имеет функцию, которую я ищу, в соответствии с этим:

http://www.imagemagick.org/api/MagickWand/montage_8c.html

Однако я не могу найти его в PythonMagick. Это просто недоступно? Если это так, я мог бы просто отказаться от остальной части моего кода PythonMagick и использовать subprocess.call в переносимом дистрибутиве ImageMagick или что-то в этом роде (эта программа должна быть переносимой и работать в Windows с простым портом для Mac OS ... до сих пор у меня работает несколько других команд PythonMagick, поэтому я хотел бы продолжить этот маршрут, если это возможно).

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 апреля 2015

Использование привязок Python для imagemagick / graphicsmagick очень помогает, но, к сожалению, пока не все функции доступны. У меня на самом деле была такая же проблема с @FizxMike. Мне нужно было использовать монтаж, а затем выполнить некоторые дальнейшие операции, но сохранение файла на жестком диске, а затем перезагрузка его в надлежащий объект pgmagick для выполнения остальных операций и его повторное сохранение было медленным.

В конце концов я использовал решение для подпроцесса, но вместо сохранения в файле я перенаправляю вывод в stdout. Затем я использую стандартный вывод для загрузки изображения из pgmagick.Blob в объект pgmagick.Image и выполняю остальную обработку в коде Python.

Процедура выглядит так в коде:

import os
import pgmagick
import subprocess

my_files = []
# Dir with the images that you want to operate on
dir_with_images = "."
for file in os.listdir(dir_with_images):
    if file.endswith(".png"):
        my_files.append(os.path.join(dir_with_images, file))

montage_cmd = ['gm', 'montage']
montage_cmd.extend(my_files)
# The trick is in the next line of code. Instead of saving in a file, e.g. myimage.png
# the montaged file will just be "printed" in the stdout with 'png:-'
montage_cmd.extend(['-tile', '2x2', '-background', 'none', '-geometry', '+0+0', 'png:-'])

# Use the command line 'gm montage' since there are not python bindings for it :(
p = subprocess.Popen(montage_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# Get the stdout in a variable
stdout, stderr = p.communicate()

# Load the stdout in a python pgmagick Image object using the pgmagick.Blob
# and do the rest of the editing on python code
img = pgmagick.Image(pgmagick.Blob(stdout))
# Display the image
img.display()
geometry = pgmagick.Geometry(300, 200)
geometry.aspect(True)
# Resize the montaged image to 300x200, but keep the aspect ratio
img.scale(geometry)
# Display it again
img.display()
# And finally save it <- Only once disk access at this point.
img.write('myimage.png')
0 голосов
/ 17 июля 2012

У меня та же проблема, даже pgmagick не хватает необходимой функции montageImage () ( Пример монтажа Magick ++ )

Это то, что я делаю (в DjangoВид):

#ImageMagick CLI is better documented anyway (-background none preserves transparency)
subprocess.call("montage -border 0 -geometry "+str(cols)+"x -tile 1x"+str(len(pages))+" "+target_path[0:len(target_path)-4]+"[0-9]*.png -background none "+target_path,shell=True)`

Не забавно, потому что сначала мне приходится перетаскивать кучу файлов ... запись на жесткий диск - не самая быстрая вещь, а затем удалить временные файлы.

Я бы предпочел сделать все это в ОЗУ.

Я все еще в поисках лучшего ответа.

...