Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 29, 2014 20:29:52

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование картинки в base64

В общем-то само по себе кодирование делается просто, я понимаю. Но у меня вопрос с некоторым извращением
Я беру картинку, открываю ее с помощью PIL.Image.
Вырезаю нужную мне часть с помощью kartinka.crop()
Далее сохраняю в виде файла.
Затем открываю файл и делаю b64encode(kartinka)
Все нормально.

Но вот я хочу сделать все это в памяти, то есть не записывать-читать файл. Это лишнее. Но вот не получается никак. Если сделать:
kartinka = kartinka.crop()
а затем:
kartinka = b64encode(kartinka)
то вываливается исключение:

TypeError: expected bytes, not _ImageCrop

то есть проблема в том, что переменную такого типа нельзя закодировать.
Подскажите, пожалуйста, как это можно обойти. Как можно произвести эту операцию без записи/чтения в/из файла?

Офлайн

#2 Июнь 29, 2014 21:48:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Кодирование картинки в base64

crop = img.crop((1, 2, 3, 4))
crop_b64 = base64.b64encode(crop.tostring())



Отредактировано py.user.next (Июнь 29, 2014 21:48:43)

Офлайн

#3 Июнь 29, 2014 22:10:55

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование картинки в base64

py.user.next
crop = img.crop((1, 2, 3, 4))
crop_b64 = base64.b64encode(crop.tostring())


Я так пробовал, но tostring(), видимо, не напрямую в строку преобразовывает, а как я понял, попиксельно, и выходит ерунда. Это уже не те данные. На выходе уже как бы не файл перекодированный, а попиксельные данные перекодированные.
Это сразу видно, если вывести на экран одно и другое.
Вот кусок после tostring()
b'///d////3f///93////d////3f///93////d////3f///93////d////3f///93////d////3f///93///7f///95P///uL////Z////1v///9j////b///+4P///uL////k//b21P///93///7g////9v+xqLn/n5HE/7qo5v/Gr+X

а вот, если нормально:
b'/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL

Отредактировано jor77 (Июнь 29, 2014 22:13:38)

Офлайн

#4 Июнь 29, 2014 23:55:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Кодирование картинки в base64

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)

Офлайн

#5 Июнь 30, 2014 19:43:07

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование картинки в base64

Хммм… Я подозревал, что через BytesIO делать надо, но почему-то никак не приходило в голову как именно. Ваш вариант работает как надо!
Спасибо огромное!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version