Python实现图片批量压缩与尺寸调整实战

半杯拿铁
半杯拿铁
发布时间:2026-10-15 | 2人浏览过
原创

本文介绍使用Python的Pillow库进行图片批量压缩与尺寸调整的方法。通过安装依赖、遍历目录、获取文件大小,并设定目标体积(如150KB)和压缩步长,程序可自动迭代降低图片质量直至达标。同时支持先调整图片分辨率再压缩体积的操作流程,适用于提升网页加载速度的场景。

在Web项目中,图片资源的加载速度直接影响用户体验。当原始图片体积过大时,会导致页面加载缓慢。为了解决这一问题,需要对项目中的图片文件进行统一的压缩处理,以减小文件体积并提升加载效率。

实现方案一:基于Pillow库的压缩与调整

首先,需要安装Python的图片处理库Pillow。


python -m pip install Pillow

在Python脚本中导入必要的模块,包括用于图片处理的Image以及用于文件操作的os模块。


from PIL import Image
import os

为了判断图片是否需要进行压缩,需要编写一个函数来获取图片文件的实际大小。该函数通过os.path.getsize获取字节数,并转换为KB单位返回。


def get_size(file):
    # 获取文件大小:KB
    size = os.path.getsize(file)
    return size / 1024

接下来,需要遍历指定目录下的所有文件,筛选出需要处理的图片文件,并打印文件名以便确认处理对象。


dir_path = r'file_path'
items = os.listdir(dir_path)

for item in items:
    # print(item)
    path = os.path.join(dir_path, item)
    print(item)

核心压缩逻辑:定义一个compress_image函数,目标是将图片压缩至指定大小(例如150KB)。该函数接受源文件路径、输出路径、目标大小(mb)、调整步长(step)和初始质量(quality)作为参数。如果源文件已小于目标大小,则直接复制;否则,通过循环降低quality值(每次减少step),重新保存文件,直到文件大小小于或等于目标值。


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

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

尺寸调整逻辑:如果同时需要修改图片分辨率,可以定义resize_image函数。该函数根据设定的宽度(x_s)按比例计算高度,使用Image.ANTIALIAS算法进行重采样,保存调整后的图片。建议先执行尺寸调整,再执行体积压缩,以获得最佳效果。


def resize_image(infile, outfile='', x_s=800):
    """修改图片尺寸
    :param infile: 图片源文件
    :param outfile: 重设尺寸文件保存地址
    :param x_s: 设置的宽度
    :return:
    """
    im = Image.open(infile)
    x, y = im.size
    y_s = int(y * x_s / x)
    out = im.resize((x_s, y_s), Image.ANTIALIAS)

    out.save(outfile)

程序执行:在主程序中调用上述函数,指定源文件路径和目标输出路径。例如,将指定目录下的图片压缩并保存至E盘docs文件夹下。


if __name__ == '__main__':
                      # 源路径      # 压缩后路径
    compress_image(r"file_path", r"E:\docs\2.JPG")
                    # 源路径      # 压缩后路径
    resize_image(r"file_path", r"E:\docs\3.JPG")

实现方案二:另一种批量处理思路


import os
from PIL import Image
import threading,time

def imgToProgressive(path):
    if not path.split('.')[-1:][0] in ['png','jpg','jpeg']:  #if path isn't a image file,return
        return
    if os.path.isdir(path):
        return
##########transform img to progressive
    img = Image.open(path)
    destination = path.split('.')[:-1][0]+'_destination.'+path.split('.')[-1:][0]
    try:
        print(path.split('\\')[-1:][0],'开始转换图片')
        img.save(destination, "JPEG", quality=80, optimize=True, progressive=True) #转换就是直接另存为
        print(path.split('\\')[-1:][0],'转换完毕')
    except IOError:
        PIL.ImageFile.MAXBLOCK = img.size[0] * img.size[1]
        img.save(destination, "JPEG", quality=80, optimize=True, progressive=True)
        print(path.split('\\')[-1:][0],'转换完毕')
    print('开始重命名文件')
    os.remove(path)
    os.rename(destination,path)

for d,_,fl in os.walk(os.getcwd()):    #遍历目录下所有文件
    for f in fl:
        try:
            imgToProgressive(d+'\\'+f)
        except:
            pass

以上介绍了使用Python进行图片批量压缩和尺寸调整的具体实现。通过灵活调整参数,可以适应不同场景下的图片优化需求。更多关于Python图像处理的技术细节,可参考本站其他相关文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表