Ни где не смог найти работающий пример, как вывести произвольное
изображение сгенерированное python-скриптом в тег <img src="" />.Задача собственно такова:
Имеется некая html-страница содержащая строку:
<img src="/cgi-bin/captcha.py" />
Соответственно имеется скрипт /cgi-bin/captcha.py который
создает при помощи библиотеки PIL произвольную картинку
(либо загружает ее из файла - не важно).import Image
im = Image.open("image.jpg")
print 'Content-Type: image/jpeg \n\n'
print imДанный скрипт неправильный (неработает) - я просто привел его
в качестве примера чтобы показать, что я хочу получить.Как правильно вывести картинку содержащуюся в переменной "im" в
тег <img src="" /> ?
В скрипте две ошибки, не считая возможного отсутствия shebang и x бита на файле.
1. python в отличии от perl всегда делает перевод строки при print, так что один \n лишний
2. print im выведет текст вроде <JpegImagePlugin.JpegImageFile instance at 0xb7b55f2c>. Для вывода содержимого объекта нужно использовать метод save и sys.stdout
Итого правильным вариантом будет
#!/usr/bin/python
import Image
import sys
im = Image.open("image.jpg")
print 'Content-Type: image/jpeg\n'
im.save(sys.stdout, "JPEG")
>import sys
>import Image
>im = Image.open("../img/big.jpg")
>print "Content-type: image/jpeg\n"
>im.save(sys.stdout, "JPEG")У меня этот код выводит в броузер вместо картинки какую-то охинею (всё в больших разноцветных квадратиках).
При этом:
>im.save("../img/small50.jpg", "JPEG", quality=50)
создает на диске абсолютно нормальный файл....
Интересно, где собака зарыта...
Мне уже удалось найти работающий пример но он выглядит немного
по другому:#------- captcha.py -----------
#!/usr/local/bin/pythonimport Image
import cStringIOim = Image.open("image.jpg")
f = cStringIO.StringIO()
im.save(f, "PNG")
f.seek(0)
print 'Content-Type: image/png\n'
print f.read()#------- end file -------------
По сравнению с прямым выводом в stdout лишнее пожирание памяти на хранение копии картинки и ненужное преобразование в png, но говорят питонщиков подобные мелочи не интересуют ;)
Скрипт написал на основе идей кода отсюда:http://lost-theory.org/python/dynamicimg.html
Не знаю, как на счет лишнего расхода памяти - просто каптча
как правило мааааленькая картинка так что думаю что в
данном случае это не критично.
Проверил ваш вариант - работает нормально. Что касается
"ненужного преобразование в png" - делать его придется
по любому. Дело в том что пример с загрузкой готового
изображения я привел для простоты. На самом деле каптча
генерируется на лету и уже потом на выходе преобразуется
в какой-нибудь конкретный формат (jpg/png - не важно).