• 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

  • 相关阅读:
    回忆Partition算法及利用Partition进行快排
    2019春第七周作业
    2019春第六周作业
    2019春第五周作业
    2019年春季学期第四周作业。
    2019年春季学期第三周作业
    2019年春季学期第二周作业
    2019春第一周作业编程总结
    PTA编程总结2—币值转换
    第七周编程总结
  • 原文地址:https://www.cnblogs.com/changbaishan/p/8618035.html
Copyright © 2020-2023  润新知