使用python压缩图片大小分为两种情况:
- 缩小图片尺寸,同时缩小了图片大小
- 不改变图片尺寸,降低图片质量,缩小图片质量
两种情况都要使用PIL模块;
第一种情况,使用resize方法:
伪代码如下:
代码语言:python代码运行次数:0复制# 压缩图片文件
def compress_image(outfile, mb=150, k=0.9):
"""
:param outfile: 压缩文件保存地址
:param mb: 压缩目标,KB
:param k: 每次调整的压缩比率
:return: 压缩文件地址,压缩文件大小
"""
from PIL import Image
from PIL import ImageFile
o_size = os.path.getsize(outfile) // 1024
print(o_size, mb)
if o_size <= mb:
return outfile
ImageFile.LOAD_TRUNCATED_IMAGES = True
while o_size > mb:
im = Image.open(outfile)
x, y = im.size
out = im.resize((int(x*k), int(y*k)), Image.ANTIALIAS)
try:
out.save(outfile)
except Exception as e:
print(e)
break
o_size = os.path.getsize(outfile) // 1024
return outfile
第一种情况,使用save方法并添加quality参数:
伪代码如下:
代码语言:python代码运行次数:0复制# 不改变图片尺寸压缩到指定大小
def compress_img(img_path,new_img_path):
import os
from PIL import Image
#img_path = "path/to/your/image" # 要压缩的图片路径
#new_img_path = "path/to/your/new/image" # 压缩好的图片保存路径
target_size = 150 * 1024 # 单位:字节(B),即目标大小 150 KB
quality = 80 # 保留质量,1-100(默认 75),1 最差,100 最好,不建议过高且 100 会禁用一些压缩算法
step = 10 # 降低质量的步长
current_img = Image.open(img_path) # 初始化当前图片为原图
current_size = os.path.getsize(img_path) # 初始化当前大小为原图片大小
while current_size > target_size and quality > 0:
current_img.save(new_img_path, quality=quality,
optimize=True) # 压缩新图片到 new_img_path
current_img = Image.open(new_img_path) # 更新 current_img 为压缩后的新图片
# 更新 current_size 为压缩后的新图片大小
current_size = os.path.getsize(new_img_path)
quality -= step