python PIL.Image與Base64 String的互相轉換


 環境

  • py2:python2.7.13
  • py3:python3.7.5
  • PIL:pip(2/3) install pillow,PIL庫已經不再維護,而pillow是PIL的一個分支,如今已超越PIL

1、Convert PIL.Image to Base64 String

  • py2:先使用CStringIO.StringIO把圖片內容轉為二進制流,再進行base64編碼
 1 import base64
 2 from cStringIO import StringIO
 3 
 4 # pip2 install pillow
 5 from PIL import Image
 6 
 7 
 8 def image_to_base64(image_path):
 9     img = Image.open(image_path)
10     output_buffer = StringIO()
11     img.save(output_buffer, format='JPEG')
12     binary_data = output_buffer.getvalue()
13     base64_data = base64.b64encode(binary_data)
14     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:
 1 import re
 2 import base64
 3 from cStringIO import StringIO
 4 
 5 from PIL import Image
 6 
 7 
 8 def base64_to_image(base64_str, image_path=None):
 9     base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
10     binary_data = base64.b64decode(base64_data)
11     img_data = StringIO(binary_data)
12     img = Image.open(img_data)
13     if image_path:
14         img.save(image_path)
15     return img
  • py3:
 1 import re
 2 import base64
 3 from io import BytesIO
 4 
 5 from PIL import Image
 6 
 7 
 8 def base64_to_image(base64_str, image_path=None):
 9     base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
10     byte_data = base64.b64decode(base64_data)
11     image_data = BytesIO(byte_data)
12     img = Image.open(image_data)
13     if image_path:
14         img.save(image_path)
15     return img

 

參考:https://www.cnblogs.com/changbaishan/p/8618035.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM