Python3在线转换Webp图片格式并上传七牛云
本文介绍如何使用Python3将远程Webp图片在线转换为PNG格式并直接上传至七牛云。通过requests获取图片二进制流,利用Pillow库的Image模块处理字节流,避免本地下载,实现高效格式转换与存储。
前言
图片格式转换的方法众多,但涉及转换为二进制字节流的方案,我经过一下午的搜索,最终在 Stack Overflow 上找到了相关解答。说明一下进行在线格式转换的原因:作为一名使用 Python3 的爬虫开发者,我的需求是抓取文章中的图片,并将其上传至公司的七牛云存储。这意味着图片无需下载到本地,只需在获取图片 URL 后,读取其二进制数据,上传至公司七牛云,同时完成格式替换(这一点颇为棘手)。
将图片的二进制数据上传至七牛云本身并不困难,参考七牛云的 API 文档即可实现。然而,七牛云官方文档中的 Python API 存在一定缺陷,其示例代码主要展示使用 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 上提问,最终在 Stack Overflow 上找到了解决方案。
import io
from PIL import Image # 注意我的Image版本是pip3 install Pillow==4.3.0
import requests
res = requests.get('http://images.xxx.com/-7c0dc4dbdca3.webp')
byte_stream = io.BytesIO(res.content) # 把请求到的数据转换为Bytes字节流(这样解释不知道对不对,可以参照[廖雪峰](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431918785710e86a1a120ce04925bae155012c7fc71e000)的教程看一下)
roiImg = Image.open(byte_stream) # Image打开二进制流Byte字节流数据
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 上的第一篇,经过一下午的搜索,过程令人绝望。还是 Stack Overflow 更为实用,以下是我找到答案的链接。
今天登录 GitHub 时,发现之前提问的作者回复了我,链接为:https://github.com/python-pillow/Pillow/issues/3192
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













