前言
首先图片格式转换的方法有很多,但是转图片字节流的,我搜了一下午终于在 stackoverflow上搜到了
说一下为什么要在线转这个图片格式
图片不需要下载到本地,爬取到图片url后,读取图片字节流数据,然后上传到自己七牛云上面,并且替换其格式(这一点很坑)
- 上传图片二进制数据到七牛云上面不难, 照着七牛云API文档基本就能行,有一点坑,七牛云官方文档Python API 上面的Demo全是上传本地图片的put_file()方法,我要上传远程服务器上面的,没看到对应的方法。
- 准备修改qiniu SDK源码的,看到了一个put_data()方法能传字节流数据。
好我写这篇博文重点来了
需求:由于我爬取的图片远程是google的 .webp格式的图片, 链接是https://xxxx.webp这种,而这个格式又不能直接修改后缀改。
于是我去网上搜Python3 图片格式转换的方法。
最多的就是这种方法
from PIL import Image # 安装pillow 有些小坑 对了我的版本是Pillow==4.3.0
im = Image.open("./demo1.jpg")
im.save("./demo2.png")
但是我要上传的文件都不在本地,都是请求图片二进制流在线修改图片后缀。
二话不说直接亮代码吧,找了一下午,还在pillow的github issue上提问。终于在stackoverflow上搜到了。
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)
我感觉我这个在线转换的绝对是CSDN第一篇, 搜了一下午,人都搜绝望了。
还是 stackoverflow 好用, 这个链接就是我搜到答案。
今天一上github ,作者回复我了的问题了,https://github.com/python-pillow/Pillow/issues/3192
虽然我自己查出来了,但还是感谢作者。