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

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

TypeError: expected bytes, not _ImageCrop

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

py.user.next
crop = img.crop((1, 2, 3, 4))
crop_b64 = base64.b64encode(crop.tostring())
jor77
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
py.user.next
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)
jor77
Хммм… Я подозревал, что через BytesIO делать надо, но почему-то никак не приходило в голову как именно. Ваш вариант работает как надо!
Спасибо огромное!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB