Как кодировать и декодировать между строкой base64 и массивом numpy? - PullRequest
0 голосов
/ 21 мая 2018

В StackOverflow уже есть несколько решений для декодирования и кодирования изображения и строки base64.Но большинству из них нужен ввод-вывод между дисками, что является потерей времени.Есть ли решения для кодирования и декодирования только в памяти?

1 Ответ

0 голосов
/ 21 мая 2018

Кодировка

Ключевым моментом является то, как преобразовать пустой массив в 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

...