Форум сайта python.su
0
В общем-то само по себе кодирование делается просто, я понимаю. Но у меня вопрос с некоторым извращением 
Я беру картинку, открываю ее с помощью PIL.Image.
Вырезаю нужную мне часть с помощью kartinka.crop()
Далее сохраняю в виде файла.
Затем открываю файл и делаю b64encode(kartinka)
Все нормально.
Но вот я хочу сделать все это в памяти, то есть не записывать-читать файл. Это лишнее. Но вот не получается никак. Если сделать:
kartinka = kartinka.crop()
а затем:
kartinka = b64encode(kartinka)
то вываливается исключение:
TypeError: expected bytes, not _ImageCrop
то есть проблема в том, что переменную такого типа нельзя закодировать.
Подскажите, пожалуйста, как это можно обойти. Как можно произвести эту операцию без записи/чтения в/из файла?
Офлайн
857
crop = img.crop((1, 2, 3, 4)) crop_b64 = base64.b64encode(crop.tostring())
Отредактировано py.user.next (Июнь 29, 2014 21:48:43)
Офлайн
0
py.user.next
crop = img.crop((1, 2, 3, 4))
crop_b64 = base64.b64encode(crop.tostring())
Отредактировано jor77 (Июнь 29, 2014 22:13:38)
Офлайн
857
import PIL.Image import io import base64 img = PIL.Image.open('1.png') crop = img.crop((10, 10, 20, 20)) crop_io = io.BytesIO() crop.save(crop_io, img.format) crop_io.seek(0) crop_b = crop_io.read() crop_b64 = base64.b64encode(crop_b)
Отредактировано py.user.next (Июнь 29, 2014 23:55:32)
Офлайн
0
Хммм… Я подозревал, что через BytesIO делать надо, но почему-то никак не приходило в голову как именно. Ваш вариант работает как надо!
Спасибо огромное! 
Офлайн