Кодировка
Ключевым моментом является то, как преобразовать пустой массив в bytes
объект с кодировкой (такой как кодировка JPEG или PNG, а не кодировка base64).Конечно, мы можем сделать это, сохранив и прочитав изображение с imsave
и imread
, но PIL предоставляет более прямой метод:
from PIL import Image
import skimage
import base64
def encode(image) -> str:
# convert image to bytes
with BytesIO() as output_bytes:
PIL_image = Image.fromarray(skimage.img_as_ubyte(image))
PIL_image.save(output_bytes, 'JPEG') # Note JPG is not a vaild type here
bytes_data = output_bytes.getvalue()
# encode bytes to base64 string
base64_str = str(base64.b64encode(bytes_data), 'utf-8')
return base64_str
Декодирование
Ключевая проблема здеськак читать изображения из декодированного bytes
.Плагин imageio
в skimage
предоставляет такой метод:
import base64
import skimage.io
def decode(base64_string):
if isinstance(base64_string, bytes):
base64_string = base64_string.decode("utf-8")
imgdata = base64.b64decode(base64_string)
img = skimage.io.imread(imgdata, plugin='imageio')
return img
Обратите внимание, что для вышеуказанного метода необходим пакет Python imageio
, который может быть установлен с помощью pip:
pipустановить imageio