Python批量压缩图片:节省存储空间的实用脚本

简介: 本文介绍如何用Python(Pillow库)编写50行内批量图片压缩脚本:支持尺寸缩放、质量调节、透明通道处理与进度反馈;兼顾隐私安全、高度定制与多线程加速,轻松将4K/RAW图压缩90%以上,适用于电商、旅行、设计等场景。(239字)

​免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0

引言:为什么需要批量压缩图片?
手机拍摄的4K照片动辄10MB,单反相机拍摄的RAW格式图片更是高达50MB以上。当需要分享旅行照片、上传电商产品图或管理设计素材库时,庞大的图片体积会带来诸多困扰:云存储空间快速耗尽、网页加载速度变慢、邮件发送附件受限……批量压缩图片成为解决这些问题的关键手段。
代理IP在实时交通数据采集的作用.png

通过Python脚本实现自动化压缩,不仅能精准控制压缩参数,还能批量处理成百上千张图片。相比在线工具,本地脚本无需上传隐私图片,处理速度更快;相比专业软件,Python方案无需付费且可高度定制。本文将通过实际案例,展示如何用50行代码构建高效图片压缩工具。

一、核心原理:如何实现图片压缩?
图片压缩主要通过两种技术路径实现,Python的Pillow库完美支持这两种方式:

  1. 尺寸压缩:降低分辨率
    原始图片尺寸为4000×3000像素,若目标设备仅需1920×1080显示,直接缩小尺寸可减少75%像素量。Pillow的thumbnail()方法能自动保持宽高比进行缩放:

from PIL import Image
img = Image.open("photo.jpg")
img.thumbnail((1920, 1080)) # 保持比例缩放

  1. 质量压缩:优化编码
    JPEG格式通过调整质量参数(1-100)控制压缩强度。质量值越低,文件越小但可能产生噪点。实测显示,质量85时人眼难以察觉差异,但文件体积可减少60%:

img.save("compressed.jpg", quality=85, optimize=True)

  1. 智能组合策略
    最佳实践是同时应用尺寸和质量压缩。例如将4000×3000图片缩小至1920×1440后,再设置质量85,实测5.2MB原图可压缩至320KB,体积减少94%而肉眼几乎无差别。

二、基础脚本:50行代码实现批量压缩
以下脚本支持递归处理子目录,自动创建输出文件夹,并显示压缩进度:

import os
from PIL import Image
from pathlib import Path

def compress_image(input_path, output_path, max_size=1920, quality=85):
"""压缩单张图片"""
try:
with Image.open(input_path) as img:

        # 转换模式处理透明通道
        if img.mode in ("RGBA", "P"):
            img = img.convert("RGB")

        # 按比例缩放
        img.thumbnail((max_size, max_size), Image.LANCZOS)

        # 保存为JPEG格式
        output_path = output_path.with_suffix('.jpg')
        img.save(output_path, "JPEG", optimize=True, quality=quality)

        # 计算压缩率
        orig_size = os.path.getsize(input_path)
        new_size = os.path.getsize(output_path)
        ratio = (1 - new_size / orig_size) * 100
        print(f"✅ {Path(input_path).name}: {orig_size//1024}KB → {new_size//1024}KB (节省{ratio:.1f}%)")

except Exception as e:
    print(f"❌ 压缩失败 {input_path}: {e}")

def batch_compress(input_folder, output_folder, max_size=1920, quality=85):
"""批量处理文件夹"""
input_path = Path(input_folder)
output_path = Path(output_folder)
output_path.mkdir(parents=True, exist_ok=True)

# 支持的图片格式
supported_ext = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')

# 遍历所有图片文件
image_files = [
    f for f in input_path.rglob('*') 
    if f.suffix.lower() in supported_ext and f.is_file()
]

if not image_files:
    print("⚠️ 指定文件夹中没有可处理的图片")
    return

print(f"🔍 找到 {len(image_files)} 张图片,开始压缩...")
for img_file in image_files:
    rel_path = img_file.relative_to(input_path)
    out_file = output_path / rel_path.with_stem(f"{rel_path.stem}_compressed")
    compress_image(img_file, out_file, max_size, quality)

print(f"\n🎉 全部完成!压缩后图片保存在: {output_folder}")

if name == "main":
batch_compress("./photos", "./compressed", max_size=1200, quality=75)

脚本特性说明:

智能路径处理:使用Path.rglob()递归查找所有子目录中的图片
透明通道处理:自动将PNG的RGBA模式转换为RGB,避免JPEG保存错误
进度可视化:实时显示每张图片的压缩前后大小及节省比例
安全设计:输出路径自动创建,避免因目录不存在导致的错误
三、进阶优化:满足不同场景需求

  1. 动态质量调整(SSIM算法)
    对于需要极致压缩的场景,可通过结构相似性(SSIM)评估图片质量损失,动态调整压缩参数:

from math import log
from SSIM_PIL import compare_ssim # 需安装pyssim库

def get_ssim_at_quality(photo, quality):
"""计算指定质量下的SSIM值"""
temp_path = "temp.jpg"
photo.save(temp_path, format="JPEG", quality=quality, progressive=True)
ssim_score = compare_ssim(photo, Image.open(temp_path))
os.remove(temp_path)
return ssim_score

def find_optimal_quality(original_photo, target_ssim=0.95):
"""二分法寻找最优质量参数"""
low, high = 70, 95
while high - low > 2:
mid = (high + low) // 2
if get_ssim_at_quality(original_photo, mid) < target_ssim:
low = mid
else:
high = mid
return high

使用示例

img = Image.open("photo.jpg")
optimal_quality = find_optimal_quality(img)
img.save("optimized.jpg", quality=optimal_quality)

  1. 格式转换优化
    对于截图、图标等简单图形,转换为PNG格式并启用调色板优化可获得更好效果:

def compress_png(input_path, output_path, palette_size=256):
"""PNG无损压缩"""
img = Image.open(input_path)
if img.mode == "RGB":

    # 生成最优调色板
    palleted_img = img.convert(
        'P', 
        palette=Image.ADAPTIVE, 
        colors=palette_size
    )
    palleted_img.save(
        output_path, 
        optimize=True,
        compress_level=9  # 最大压缩级别
    )
  1. 多线程加速处理
    处理大量图片时,使用多线程可显著提升速度:

from concurrent.futures import ThreadPoolExecutor

def parallel_compress(input_folder, output_folder, max_workers=4):
"""多线程压缩"""
image_files = [f for f in Path(input_folder).rglob('*')
if f.suffix.lower() in ('.jpg', '.png') and f.is_file()]

with ThreadPoolExecutor(max_workers=max_workers) as executor:
    for img_file in image_files:
        rel_path = img_file.relative_to(input_folder)
        out_file = Path(output_folder) / rel_path.with_stem(f"{rel_path.stem}_compressed")
        executor.submit(
            compress_image, 
            img_file, 
            out_file, 
            max_size=1200, 
            quality=75
        )

四、实战案例:电商图片处理流程
某电商团队需要处理5000张产品图,要求:

统一尺寸为800×800像素
JPEG质量设置为80
保留原始文件名并添加"_web"后缀
生成处理报告
解决方案:
import pandas as pd
from datetime import datetime

def ecommerce_compress(input_folder, output_folder):
"""电商图片专用压缩流程"""
results = []
start_time = datetime.now()

for img_file in Path(input_folder).rglob('*.jpg'):
    try:
        # 创建输出路径
        rel_path = img_file.relative_to(input_folder)
        out_file = Path(output_folder) / rel_path.with_stem(f"{rel_path.stem}_web")
        out_file.parent.mkdir(parents=True, exist_ok=True)

        # 压缩处理
        with Image.open(img_file) as img:
            # 强制正方形裁剪(需先安装opencv-python)
            # import cv2
            # img = cv2.resize(np.array(img), (800,800))
            # img = Image.fromarray(img)

            # 简单缩放方案
            img.thumbnail((800, 800), Image.LANCZOS)
            img.save(out_file, "JPEG", quality=80, optimize=True)

        # 记录结果
        results.append({
            "文件名": img_file.name,
            "原始大小(KB)": os.path.getsize(img_file)//1024,
            "压缩后(KB)": os.path.getsize(out_file)//1024,
            "状态": "成功"
        })

    except Exception as e:
        results.append({
            "文件名": img_file.name,
            "原始大小(KB)": "-",
            "压缩后(KB)": "-",
            "状态": f"失败: {str(e)}"
        })

# 生成报告
df = pd.DataFrame(results)
report_path = Path(output_folder) / f"压缩报告_{datetime.now().strftime('%Y%m%d')}.csv"
df.to_csv(report_path, index=False)

print(f"\n处理完成!耗时: {(datetime.now()-start_time).seconds}秒")
print(f"详细报告已生成: {report_path}")

使用示例

ecommerce_compress("./raw_images", "./web_images")

五、常见问题解决方案

  1. 处理透明背景图片
    错误做法:直接保存为JPEG会丢失透明通道
    正确方案:

def handle_transparency(input_path, output_path):
img = Image.open(input_path)
if img.mode == "RGBA":

    # 创建白色背景
    background = Image.new("RGB", img.size, (255, 255, 255))
    background.paste(img, mask=img.split()[-1])
    background.save(output_path, "JPEG", quality=85)
else:
    img.save(output_path, "JPEG", quality=85)
  1. 保留EXIF信息
    使用piexif库可保留照片的拍摄参数:

import piexif

def save_with_exif(img, output_path, quality=85):
"""保存图片并保留EXIF信息"""
exif_dict = piexif.load(img.info['exif']) if 'exif' in img.info else {}
img.save(
output_path,
"JPEG",
quality=quality,
exif=piexif.dump(exif_dict)
)

  1. 处理超大图片
    对于超过100MB的TIFF格式图片,需先分块处理:

from PIL import ImageSequence

def process_large_tiff(input_path, output_path):
"""分块处理超大TIFF文件"""
with Image.open(input_path) as img:
for i, page in enumerate(ImageSequence.Iterator(img)):
page.thumbnail((4000, 4000)) # 先缩小尺寸
page.save(
f"{output_path}_page{i}.jpg",
"JPEG",
quality=80,
optimize=True
)

六、性能对比:不同压缩方案效率
方案 处理速度 压缩率 质量损失 适用场景
单纯尺寸压缩 ★★★★★ 中 无 网页显示
质量85压缩 ★★★★ 高 轻微 电商产品图
SSIM动态质量调整 ★★★ 极高 极小 高端摄影作品
PNG调色板优化 ★★ 中 无 简单图形/图标
多线程处理 ★★★★★ 高 同单线程 批量处理
实测数据显示:5000张图片处理时,单线程需2小时,8线程方案仅需25分钟。

七、总结:构建个性化图片处理流水线
通过组合本文介绍的技术模块,可构建满足不同需求的图片处理系统:

基础版:尺寸+质量压缩(适合大多数场景)
电商版:正方形裁剪+水印添加+EXIF保留
摄影版:SSIM动态质量+渐进式JPEG
极速版:多线程处理+缓存机制
建议从基础脚本开始,根据实际需求逐步添加功能模块。对于非技术用户,可使用PyInstaller将脚本打包为EXE文件,无需安装Python环境即可运行。

图片压缩的本质是在文件体积与视觉质量间寻找平衡点。掌握这些技术后,您不仅能节省存储空间,更能为网站加速、移动应用优化等场景提供关键支持。

目录
相关文章
|
5天前
|
人工智能 自然语言处理 Shell
🦞 如何在 Moltbot 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 Moltbot 配置阿里云百炼 API
|
4天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
5114 12
|
10天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
6691 10
|
4天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
3186 18
|
2天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
2210 6
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
4天前
|
人工智能 安全 Shell
在 Moltbot (Clawdbot) 里配置调用阿里云百炼 API 完整教程
Moltbot(原Clawdbot)是一款开源AI个人助手,支持通过自然语言控制设备、处理自动化任务,兼容Qwen、Claude、GPT等主流大语言模型。若需在Moltbot中调用阿里云百炼提供的模型能力(如通义千问3系列),需完成API配置、环境变量设置、配置文件编辑等步骤。本文将严格遵循原教程逻辑,用通俗易懂的语言拆解完整流程,涵盖前置条件、安装部署、API获取、配置验证等核心环节,确保不改变原意且无营销表述。
1985 5
|
4天前
|
机器人 API 数据安全/隐私保护
只需3步,无影云电脑一键部署Moltbot(Clawdbot)
本指南详解Moltbot(Clawdbot)部署全流程:一、购买无影云电脑Moltbot专属套餐(含2000核时);二、下载客户端并配置百炼API Key、钉钉APP KEY及QQ通道;三、验证钉钉/群聊交互。支持多端,7×24运行可关闭休眠。
3318 7
|
3天前
|
人工智能 JavaScript 安全
Clawdbot 对接飞书详细教程 手把手搭建你的专属 AI 助手
本教程手把手教你将 Moltbot(原 Clawdbot)部署在 Linux 服务器,并对接飞书打造专属 AI 助手:涵盖环境准备、Node.js/NVM 安装、Moltbot 快速安装(支持 Qwen 模型)、Web 管理面板配置及飞书应用创建、权限设置与事件回调对接,全程图文指引,安全可靠。
1854 3
Clawdbot 对接飞书详细教程 手把手搭建你的专属 AI 助手
|
5天前
|
存储 安全 数据库
使用 Docker 部署 Clawdbot(官方推荐方式)
Clawdbot 是一款开源、本地运行的个人AI助手,支持 WhatsApp、Telegram、Slack 等十余种通信渠道,兼容 macOS/iOS/Android,可渲染实时 Canvas 界面。本文提供基于 Docker Compose 的生产级部署指南,涵盖安全配置、持久化、备份、监控等关键运维实践(官方无预构建镜像,需源码本地构建)。
2337 7
|
4天前
|
人工智能 应用服务中间件 API
刚刚,阿里云上线Clawdbot全套云服务!
阿里云上线Moltbot(原Clawdbot)全套云服务,支持轻量服务器/无影云电脑一键部署,可调用百炼平台百余款千问模型,打通iMessage与钉钉消息通道,打造开箱即用的AI智能体助手。
2566 22
刚刚,阿里云上线Clawdbot全套云服务!