最近使用Django注册时,想使用python生成二维码图片上传到阿里云,于是在都端使用qrcode生成了图片,但是在上传到阿里云时提示错误。
之前也观察过上传到阿里云的要求,要求文件数据时byte格式的b''
于是想办法将qrcode的PIL.Image.Image格式的图片转换一下,怎么转换呢,最终在CSDN找到一篇相关的文章
文章地址:https://blog.csdn.net/wgPython/article/details/80740067
这个作者是将前端上传的数据在后段处理后上传到七牛云,作者的代码
from io import BytesIO
from PIL import Image # 注意我的Image版本是pip3 install Pillow==4.3.0
import requests
res = requests.get('http://p1.pstatp.com/list/300x196/pgc-image/152923179745640a81b1fdc.webp', stream=True) # 获取字节流最好加stream这个参数,原因见requests官方文档
byte_stream = BytesIO(res.content) # 把请求到的数据转换为Bytes字节流(这样解释不知道对不对,可以参照[廖雪峰](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431918785710e86a1a120ce04925bae155012c7fc71e000)的教程看一下)
roiImg = Image.open(byte_stream) # Image打开Byte字节流数据
# roiImg.show() # 弹出 显示图片
imgByteArr = io.BytesIO() # 创建一个空的Bytes对象
roiImg.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行
imgByteArr = imgByteArr.getvalue() # 这个就是保存的图片字节流
# 下面这一步只是本地测试, 可以直接把imgByteArr,当成参数上传到七牛云
with open("./abc.png", "wb") as f:
f.write(imgByteArr)
我的代码,由于我是qrcode生成的图片,有些不太一样,但是解决思路是一样的:
import io
import qrcode
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data('{0}/reffer?id={1}'.format(CURRENT_URL,id))
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
print(img) # 类型PIL.Image.Image
imgByteArr = io.BytesIO()
img.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行
imgByte = imgByteArr.getvalue() #这里转换后就是b''格式的数据