2012-02-20 8 views
3

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

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

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

Спасибо!

ответ

0

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

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

#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)` 

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

Я бы скорее сделал все это в баране.

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

+0

Проверьте свой ответ в этой теме. Вы можете найти это полезным :) –

1

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

В конце концов я использовал решение подпроцесса, но вместо сохранения в файле я перенаправляю вывод в stdout. Затем я использую 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') 
Смежные вопросы