В настоящее время я работаю с изображениями и хотел бы узнать самую быструю библиотеку обработки изображений, относящуюся к аннотации. В настоящее время я использую эту команду:
convert orig.tif -background Red -density 300 -font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf -pointsize 12 -gravity south -splice 0x150 -gravity southwest -annotate +50+50 "left corner" -gravity southeast -annotate +50+50 'right corner' +repage endorsed.tif
Я вызываю это внутри метода subprocess.call в python. Если я делаю это в командной строке, я получаю около 1 секунды всего времени:
real 0m0.162s
user 0m0.940s
sys 0m0.030s
Моя программа в среднем составляет 1,96 секунды:
[**copied_from** avg] 0:00:00.071887
[**mysql** avg] 0:00:00.000265
[**cropped** avg] 0:00:00.433935
[**rm** avg] 0:00:00.007758
[**copied_to** avg] 0:00:00.147880
[**endorsed** avg] 0:00:01.963496
[**mssql** avg] 0:00:00.000010
Я не уверен, почему существует расхождение между вызовом из командной строки или через python subprocess.call(cmd, shell = True). В любом случае, оба они слишком медленные.
Я в основном обрезаю и аннотирую изображения. Кажется, что кадрирование достаточно быстро с конвертированием imagemagick, но аннотирование слишком медленное. Кто-нибудь знает о более быстрой библиотеке изображений? Мне удобно использовать python/ruby, но на данном этапе было бы полезно любое решение, которое будет быстрее.
Спасибо всем.
Вызов вещей из subprocess.call
всегда будет иметь довольно много накладных расходов по сравнению с реальной оболочкой (например, bash).
Вы пытались использовать imagemagick python bindings вместо вызова через 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 на моей машине. Вышеупомянутый script занимает ~ 0,43 секунды для довольно большого изображения, а ваша эквивалентная команда imagemagick (просто запускается непосредственно из оболочки) занимает ~ 1,1 сек. Конечно, imagemagick может делать намного больше, чем PIL, но для простой манипуляции изображениями на python PIL работает очень хорошо.
(Изменить: разница в скорости - это то, что PIL сохраняет входной файл tif (который сжат LZW) как несжатый tif, а imagemagick сохраняет его как сжатый TIF LZW, аналогичный входу.)