• 如果需求量不大,建议使用TinyPNG的API服务进行无损压缩,PIL是有损压缩,压缩后图片清晰度较差
  • TinyPNG API 每月前500次压缩是免费的,需要申请API KEY TinyPNG-Developer API

调用 TinyPNG API

安装依赖包

pip install --upgrade tinify

导入依赖包

import tinify

压缩图片,保存到指定路径

def compress_image(src_file, dst_file):
    """使用TinyPNG API压缩图片
    :param src_file: 源文件路径
    :param dst_file: 输出文件路径
    """
    tinify.key = "###api key"
    source = tinify.from_file(src_file)
    source.to_file(dst_file)

使用PIL库

安装依赖包

pip install --upgrade Pillow

导入依赖包

from PIL import Image
import os

获取图片文件的大小:KB

def get_size(file):
    size = os.path.getsize(file)
    return size / 1024

压缩文件到指定大小

def compress_image(src_file, dst_file=None, mb=150, step=10, quality=80):
    """不改变图片尺寸压缩到指定大小
    :param src_file: 压缩源文件
    :param dst_file: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """
    if dst_file is None:
        dst_file = src_file
    o_size = get_size(src_file)
    if o_size <= mb:
        im = Image.open(src_file)
        im.save(dst_file)

    while o_size > mb:
        im = Image.open(src_file)
        im.save(dst_file, quality=quality)
        if quality - step < 0:
            break
        quality -= step
        o_size = get_size(dst_file)