При вызове вещей из subprocess.call
всегда будет много издержек по сравнению с реальной оболочкой (например, bash).
Вы пытались использовать привязки Python для imagemagick вместо вызова через subprocess
?(Правка: отмените это ... Эти привязки устарели. Хотя я не знаю более хороших) ... Я давно не использовал imagemagick через python ...)
Вы также можете сделать это с PIL, хотя он немного менее гибок и, вероятно, не значительно быстрее.
Для чего бы это ни стоило, вот эквивалент вашей команды imagemagick с использованием PIL.
import Image
import ImageDraw
import ImageFont
rect_height = 150
im_orig = Image.open('orig.tif')
width, height = im_orig.size
im = Image.new('RGB', (width, height+rect_height))
im.paste(im_orig, (0,0))
width, height = im.size
dpi = 300
im.info['dpi'] = (dpi, dpi)
font_size = 12
font = ImageFont.truetype('/usr/share/fonts/truetype/arial.ttf',
int(dpi * font_size / 72.0))
draw = ImageDraw.Draw(im)
draw.rectangle([(0,height-rect_height), (width, height)], fill='red')
text = 'left corner'
text_width, text_height = font.getsize(text)
draw.text((50, height - 50 - text_height),
text, fill='black', font=font)
text = 'right corner'
text_width, text_height = font.getsize(text)
draw.text((width - 50 - text_width, height - 50 - text_height),
text, fill='black', font=font)
im.save('output.tif')
Как видите, это немного менее удобно, но работает.Кроме того, это выглядит быстрее, чем imagemagick на моей машине.Приведенный выше сценарий занимает ~ 0,43 секунды для длинного изображения, в то время как ваша эквивалентная команда imagemagick (запускаемая непосредственно из оболочки) занимает ~ 1,1 секунды.Конечно, imagemagick может сделать на лот больше, чем PIL, но для простой манипуляции с изображениями в python PIL работает довольно хорошо.
(Правка: разница в скорости происходит потому, что PIL сохраняет входTIF (который является сжатым LZW) как несжатый TIF, в то время как imagemagick сохраняет его в виде сжатого файла LZW, аналогично вводу.)