python | 使用PIL压缩图片并使用字节流输出

python | 使用PIL压缩图片并使用字节流输出

因为自己服务器上的博客流量比较小,所以加了这个用来压缩图片,不改变图片大小,将图像质量降低。

直接丢代码了:

import os
from io import BytesIO
from PIL import Image
# 压缩图片函数,减轻网络压力
def compress_image(infile, mb=500, step=10, quality=80):
	"""不改变图片尺寸压缩到指定大小
	:param infile: 压缩源文件
	:param mb: 压缩目标,KB
	:param step: 每次调整的压缩比率
	:param quality: 初始压缩比率
	:return: 压缩文件字节流
	"""
	o_size = os.path.getsize(infile) / 1024
	# print(f'  > 原始大小:{o_size}')
	if o_size <= mb:
		with open(infile, 'rb') as f:
			content = f.read()
		return content      # 大小满足要求,直接返回字节流
		
	im = Image.open(infile)
	im = im.convert("RGB")      # 兼容处理png和jpg
	
	while o_size > mb:
		out = BytesIO()
		im.save(out, format="JPEG", quality=quality)
		if quality - step < 0:
			break
		_imgbytes = out.getvalue()
		o_size = len(_imgbytes) / 1024
		out.close()   # 销毁对象
		# print(f'  > 压缩至大小:{o_size} quality: {quality}')
		quality -= step   # 质量递减
	return _imgbytes


posted @ 2023-02-23 19:27  Mz1  阅读(241)  评论(0编辑  收藏  举报