PIL.Image与Base64 String的互相转换

Posted 长白山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIL.Image与Base64 String的互相转换相关的知识,希望对你有一定的参考价值。

https://www.jianshu.com/p/2ff8e6f98257

 

 

PIL.Image与Base64 String的互相转换

2018.01.18 19:02* 字数 281 阅读 39评论 0

0.环境

  • py2: python2.7.13
  • py3: python3.6.2
  • PIL: pip(2/3) install pillow, PIL库已不再维护,而pillow是PIL的一个分支,如今已超越PIL

1.Convert PIL.Image to Base64 String

  • py2 :
    先使用CStringIO.StringIO把图片内容转为二进制流,再进行base64编码
import base64
from cStringIO import StringIO

# pip2 install pillow
from PIL import Image


def image_to_base64(image_path):
    img = Image.open(image_path)
    output_buffer = StringIO()
    img.save(output_buffer, format=‘JPEG‘)
    binary_data = output_buffer.getvalue()
    base64_data = base64.b64encode(binary_data)
    return base64_data
  • py3:
    python3中没有cStringIO,对应的是io,但却不能使用io.StringIO来处理图片,它用来处理文本的IO操作,处理图片的应该是io.BytesIO
import base64
from io import BytesIO

# pip3 install pillow
from PIL import Image

# 若img.save()报错 cannot write mode RGBA as JPEG
# 则img = Image.open(image_path).convert(‘RGB‘)
def image_to_base64(image_path):
    img = Image.open(image_path)
    output_buffer = BytesIO()
    img.save(output_buffer, format=‘JPEG‘)
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data)
    return base64_str

2. Convert Base64 String to PIL.Image

要注意的是图片内容转化所得的Base64 String是不带有头信息/html标签(data:image/jpeg;base64,)的,这是在h5使用的时候需要添加用来声明数据类型的,如果拿到的Base64 String带了这个标签的话,需要处理一下,这里从参考的博客中找了一种正则处理方法。

  • py2:
import re
import base64
from cStringIO import StringIO

from PIL import Image


def base64_to_image(base64_str, image_path=None):
    base64_data = re.sub(‘^data:image/.+;base64,‘, ‘‘, base64_str)
    binary_data = base64.b64decode(base64_data)
    img_data = StringIO(binary_data)
    img = Image.open(img_data)
    if image_path:
        img.save(image_path)
    return img
  • py3
import re
import base64
from io import BytesIO

from PIL import Image


def base64_to_image(base64_str, image_path=None):
    base64_data = re.sub(‘^data:image/.+;base64,‘, ‘‘, base64_str)
    byte_data = base64.b64decode(base64_data)
    image_data = BytesIO(byte_data)
    img = Image.open(image_data)
    if image_path:
        img.save(image_path)
    return img

3. 参考

https://stackoverflow.com/questions/16065694/is-it-possible-to-create-encodeb64-from-image-object
https://stackoverflow.com/questions/31826335/how-to-convert-pil-image-image-object-to-base64-string
https://stackoverflow.com/questions/26070547/decoding-base64-from-post-to-use-in-pil

以上是关于PIL.Image与Base64 String的互相转换的主要内容,如果未能解决你的问题,请参考以下文章

numpy_array与PIL.Image之间的互转

Base64与String解码编码

Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码

Base64String与十六进制之间的转换

PIL 裁剪图像返回一个有趣的 PIL.Image._ImageCrop 数据类型

C# Image与Base64编码互转函数