【Python】PIL实现将网络图片读取并转换成base64编码和MD5

700 阅读1分钟

由于企业微信发送图片需要base64编码值和MD5值,这就需要我们将照片存在本地并用base64和hashlib两个包读取并转换

import base64
import hashlib

with open(imgPath, 'rb') as file:  # 转换图片成base64格式
    data = file.read()
    encodestr = base64.b64encode(data)
    image_data = str(encodestr, 'utf-8')

with open(imgPath, 'rb') as file:  # 图片的MD5值
    md = hashlib.md5()
    md.update(file.read())
    image_md5 = md.hexdigest()

但是因为工作中需要使用到轻流作为前端,用户上传头像和输入一下信息,生成一张工牌,轻流不具备这个功能,因此打算借助HiFlow代码块功能,获取到的轻流数据是一个网络地址:file.qingflow.com/documents/f…

这里需要借助requests包来获取response.content的方式读取到网络文件,PIL包来处理文件为二进制流

import base64
from io import BytesIO
import requests
import hashlib

# 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(img, fmt='png'):
    output_buffer = BytesIO()
    img.save(output_buffer, format=fmt)
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    # return f'data:image/{fmt};base64,' + base64_str
    return base64_str


def image_to_md5(img, fmt='png'):
    output_buffer = BytesIO()
    img.save(output_buffer, format=fmt)
    byte_data = output_buffer.getvalue()
    md = hashlib.md5()
    md.update(byte_data)
    return md.hexdigest()


img_src = filepath = bundle['inputData']['filepath']
response = requests.get(img_src)
with Image.open(BytesIO(response.content)) as _img:
    image_data = image_to_base64(_img)

with Image.open(BytesIO(response.content)) as _img:
    image_md5 = image_to_md5(_img)


output={'image_data':image_data,'image_md5':image_md5}

至此,我们已经能够把一张网络位置的图片转换成base64编码了,就可以将此作为参数去请求工牌图片了,在将工牌发送到企业微信群的时候,发现MD5不匹配,因此我想尝试用自己的方法将返回的工牌图片base64编码转为二进制流,再转一次MD5,代码如下:

import base64
import hashlib


def base64_to_md5(base64_data):
    img_data = base64.b64decode(base64_data)
    md = hashlib.md5()
    md.update(img_data)
    return md.hexdigest()


base64_param = bundle['inputData']['base64_param']
md5_data = base64_to_md5(base64_param)


output = {'base64_param': base64_param, 'md5_data': md5_data}