Python3.5使用PIL时如何在图片resize前计算输出文件大小
图片压缩需求与现状说明
- 开发环境:Python 3.5 + PIL 图像处理库
- 核心需求:将待传入的图片压缩至最大1MB以内
- 已完成的基础能力验证:
- 可通过
os.path.getsize(src)直接读取本地文件的实际字节大小,测试用原图testfile.jpg的大小为1531494字节 - 可通过PIL打开图片后直接读取原始像素尺寸,测试图的尺寸为(1654, 3968)
- 可通过
- 当前实现的方案与存在的问题:
- 现有逻辑采用循环试错方案:按不同缩放比例调整图片尺寸,保存文件后再检测实际大小,直到符合目标要求
- 方案存在明显缺陷:处理1000张不同尺寸图片时耗时极长,且调整步长粗糙,压缩后的图片往往幅度过小,远达不到最优尺寸
- 待解决的核心问题:
- 能否在执行resize操作前,计算出输出文件的预估大小
- 是否存在更高效的实现方案替代现有循环试错逻辑
已有的测试代码片段
读取原文件大小的代码
import os src = 'testfile.jpg' os.path.getsize(src) print(src)
通过PIL读取图片尺寸的代码
from PIL import Image src = 'testfile.jpg' image = Image.open(src) size = image.size print(size)
现有循环压缩的完整实现代码
def resize_image(src, reduceby=1): ''' 按传入的reduceby百分比对图片进行缩放 ''' print(" process_image:",src, reduceby) org = Image.open(src) real_size = org.size reduced_size = (int(real_size[0] * reduceby / 100),int(real_size[1] * reduceby / 100) ) org.resize(reduced_size, Image.ANTIALIAS) reduced_file = src[:-4] +"_" + str(reduceby) + src[-4:] org.save(reduced_file, optimize=True) print(" reduced_image:", reduced_file) reduced_filesize = os.path.getsize(reduced_file) return reduced_filesize, reduced_file def loop_image(src, target_size): print("loop_image :", src, target_size) file_size = os.path.getsize(src) reduced_file =src print("source :", src, file_size) reduce_by = 1 while file_size > target_size: file_size, reduced_file = resize_image(src, reduce_by) print("target :", file_size, reduced_file) reduce_by += 1 return reduced_file
注:现有实现存在两处影响效果和效率的明显逻辑漏洞:
resize_image中调用org.resize()后未接收返回值,实际保存时仍然使用未缩放的原图loop_image中reduce_by初始值为1、每次循环递增,缩放比例逐渐升高,与“从原图逐步降低尺寸直到符合目标大小”的逻辑完全相反,是导致压缩幅度过大、效率低的直接原因
内容的提问来源于stack exchange,提问作者Papageno
相关产品推荐
相关产品推荐

