如何在base64字符串和numpy数组之间进行编码和解码?

时间:2018-05-21 07:43:28

标签: python image base64 scikit-image

StackOverflow上已经有几个解决方案来解码和编码image和base64字符串。但是大多数都需要磁盘之间的IO,这是浪费时间。是否有任何解码器只能在内存中进行编码和解码?

1 个答案:

答案 0 :(得分:2)

编码

关键是如何使用编码将numpy数组转换为bytes对象(例如JPEG或PNG编码,而不是base64编码)。当然,我们可以通过使用imsaveimread保存和阅读图片来实现此目的,但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 install imageio