使用Pillow模块压缩图片

Python 可以使用 Pillow 模块操作图片。

压缩图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from PIL import Image

def thumbnail(path, savefile='', q=50):
'''压缩并保存到文件'''
img = Image.open(path)
w, h = img.size
width, height = w * q // 100, h * q // 100
img.thumbnail((width, height))
if not savefile:
savefile = '{}_{}x{}.{}'.format(
path, width, height, img.format.lower())
img.save(savefile, img.format)

def thumbnail_to_bytes(cls, path, q=50):
'''压缩并返回字节数据'''
img = Image.open(path)
w, h = img.size
width, height = w * q // 100, h * q // 100
img.thumbnail((width, height))
img_bytes = io.BytesIO()
img.save(img_bytes, img.format)
return img_bytes.getvalue()

thumbnail('test.png', 'new_test.png')
thumbnail_to_bytes('test.png')

转换Image图片格式

首先图片格式转换的方法有很多,但是转二进制字节流的,我搜了一下午终于在 stackoverflow上搜到了
说一下为什么要在线转这个图片格式
一名Python3 spider, 需求要爬去文章,并且把里面的图片,上传到本公司的七牛云上面,
意思就是,图片不需要下载到本地,爬取到图片url后,读取图片二进制数据,然后上传到自己公司七牛云上面,并且替换其格式

上传图片二进制数据到七牛云上面不难, 照着七牛云API文档基本就能行,有一点很坑,七牛云官方文档Python API 贼鸡儿坑,上面的Demo全是,上传本地图片的put_file()方法,我要上传远程服务器上面的,没看到对应的方法。
准备修改qiniu SDK源码的,看到了一个put_data()方法能传二进制数据。

这篇博文重点来了

需求:由于我爬取的图片远程是google的 .webp格式的图片, 链接是https://xxxx.webp这种,而这个格式又不能直接修改后缀改。

于是我去网上搜Python3 图片格式转换的方法。
最多的就是这种方法

1
2
3
from PIL import Image  # 安装pillow 有些小坑 对了我的版本是Pillow==4.3.0
im = Image.open("./demo1.jpg")
im.save("./demo2.png")

但是我要上传的文件都不在本地,都是请求图片二进制流在线修改图片后缀。
二话不说直接亮代码吧,亏我找了一下午,还在pillow的github上提问。终于在stackoverflow上搜到了。

1
2
3
4
5
6
7
8
9
10
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字节流
roiImg = Image.open(byte_stream) # Image打开二进制流Byte字节流数据
imgByteArr = io.BytesIO() # 创建一个空的Bytes对象
roiImg.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行
imgByteArr = imgByteArr.getvalue() # 这个就是保存的二进制流

下面这一步只是本地测试, 可以直接把imgByteArr,当成参数上传到七牛云

1
2
with open("./abc.png", "wb") as f:
f.write(imgByteArr)

参考:
[廖雪峰-StringIO和BytesIO](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431918785710e86a1a120ce04925bae155012c7fc71e000
Pillow的使用-Image篇
https://pillow-zh-cn.readthedocs.io/zh_CN/latest/handbook/tutorial.html