Python实现图片批量压缩和格式转换的终极指南
前言
你的工作生活中,是不是也经常遇到这些令人抓狂的场景?发送邮件时,附件里的图片体积太大,导致邮件发不出去或等待漫长,上传网站或社交媒体,图片加载速度慢如蜗牛,用户流失,SEO排名受影响。PPT或报告里插入大量高清图片,文件大小瞬间爆炸,传输和分享都困难。
面对这些重复且耗时的图片批量压缩和图片格式转换任务,你是不是也想告别手动压缩和转换,寻找一个更智能、更高效的解决方案?
今天,我将继续揭示Python图片处理自动化的强大魔力,手把手教你如何打造一个Python图片处理神器,让你一键提升图片传输与加载效率!
我们将深度掌握图片瘦身的秘诀,并实现多种图片格式转换,
准备好了吗?让我们一起把你的图片瞬间“瘦身”,成为办公室里的效率神器!
核心工具:Python Pillow库
还是它,上文基础的操作我们已经讲过了,它也可以轻松完成图片的打开、保存、格式转换、缩放、裁剪,当然也包括我们最关心的——图片瘦身!
现在,我们直奔主题——Python批量图片压缩!Pillow提供了非常简单的参数,就能让你在图片大小和质量之间找到最佳平衡点,让你的图片秒速瘦身!
我们将重点讲解JPG和PNG这两种最常见的图片格式。
JPG压缩(有损): 通过调整quality参数(0-100),在视觉效果可接受的前提下,牺牲少量图片细节来换取文件体积的巨大缩减。质量越低,文件越小。
PNG压缩(无损优化): PNG主要通过优化编码方式和调色板(如果图片颜色较少)来减小体积,而不是像JPG那样有损压缩,因此能保持完美质量。
JPG图片瘦身:调整质量参数,体积瞬间缩小
你的网站有大量高清JPG商品图,导致网页加载巨慢,用户等待时间过长;或者你有一堆旅行照片,想缩小尺寸以便快速上传到云盘或发送给朋友。
只需一行关键代码,Pillow就能帮你智能压缩JPG图片!
from PIL import Image
import os
def compress_jpg(image_path, output_folder, quality=85):
"""
压缩JPG图片,通过调整质量参数来减小文件体积。
这是最常用的Python压缩JPG方法,实现图片瘦身。
:param image_path: 原始JPG图片路径
:param output_folder: 压缩后图片保存的文件夹
:param quality: 压缩质量,范围0-100,数字越小压缩率越高,质量越差。推荐80-85。
"""
if not os.path.exists(image_path):
print(f"❌ 图片文件未找到:'{image_path}'。")
return
os.makedirs(output_folder, exist_ok=True) # 确保输出文件夹存在
filename = os.path.basename(image_path)
name, ext = os.path.splitext(filename)
# 确保只处理JPG文件
if ext.lower() not in [".jpg", ".jpeg"]:
print(f"⚠️ 跳过文件:'{filename}',这不是JPG/JPEG格式。")
return
# 压缩后的新文件名,带上质量参数,方便区分
output_path = os.path.join(output_folder, f"{name}_q{quality}{ext}")
try:
img = Image.open(image_path)
original_size = os.path.getsize(image_path) # 获取原始文件大小(字节)
# 核心压缩操作:保存图片时指定quality参数
img.save(output_path, quality=quality)
compressed_size = os.path.getsize(output_path) # 获取压缩后文件大小
# 打印压缩结果和比例
print(f"✅ 压缩 '{filename}' (质量: {quality})")
print(f" 原始大小: {original_size / 1024:.2f} KB")
print(f" 压缩后大小: {compressed_size / 1024:.2f} KB ({((original_size - compressed_size) / original_size) * 100:.2f}% 减小)")
except Exception as e:
print(f"❌ 压缩 '{filename}' 失败:{e}")
if __name__ == "__main__":
# --- 请修改为你的JPG图片路径和输出文件夹路径 ---
source_jpg_image = os.path.expanduser("E:/lx/pillow.jpeg") # 建议选择一张体积较大的JPG图片
output_compressed_folder_jpg = os.path.expanduser("E:/lx/compressed_jpg")
os.makedirs(output_compressed_folder_jpg, exist_ok=True)
print("--- 测试不同JPG压缩质量对文件大小的影响 ---")
compress_jpg(source_jpg_image, output_compressed_folder_jpg, quality=95) # 高质量,压缩率较低
compress_jpg(source_jpg_image, output_compressed_folder_jpg, quality=85) # 推荐值,兼顾质量与大小
compress_jpg(source_jpg_image, output_compressed_folder_jpg, quality=60) # 较高压缩率,质量可能稍有下降
操作步骤:
准备一张体积较大的JPG图片,放到你的桌面,命名为pillow.jpeg.。
修改代码中的 source_jpg_image 和 output_compressed_folder_jpg。
运行脚本。观察不同quality参数带来的文件大小变化,并对比图片质量。

重点必须是大图:才有意思,否则反而变大!!!!
PNG图片瘦身:无损优化,保持最佳质量!
你的网页或PPT中有很多带有透明背景的PNG图片,它们通常体积巨大,但又不能有损压缩(因为有损压缩会破坏透明度或产生模糊)。
Pillow对PNG提供了无损压缩优化功能。它通过优化编码方式、减少调色板颜色(如果图片颜色不多),在不牺牲图片质量的前提下减小文件体积。这是一种完美的Python压缩PNG方法。
from PIL import Image
import os
def compress_png(image_path, output_folder, optimize=True):
"""
压缩PNG图片,通过优化或减少颜色来减小文件体积。
这是高效的Python压缩PNG方法,通常是无损的图片瘦身。
:param image_path: 原始PNG图片路径
:param output_folder: 压缩后图片保存的文件夹
:param optimize: 是否进行优化(推荐True),会尝试优化编码和调色板。
"""
if not os.path.exists(image_path):
print(f"❌ 图片文件未找到:'{image_path}'。")
return
os.makedirs(output_folder, exist_ok=True)
filename = os.path.basename(image_path)
name, ext = os.path.splitext(filename)
# 确保只处理PNG文件
if ext.lower() != ".png":
print(f"⚠️ 跳过文件:'{filename}',这不是PNG格式。")
return
# 压缩后的新文件名
output_path = os.path.join(output_folder, f"{name}_optimized{ext}")
try:
img = Image.open(image_path)
original_size = os.path.getsize(image_path)
# PNG压缩主要靠optimize=True,它会尝试优化编码和调色板。
# 对于颜色较少的图片(如图标、LOGO),可以通过 convert('P') 转换为调色板模式进一步压缩,
# 这可以在几乎不损失质量的情况下大幅减小文件。
if img.mode in ('RGBA', 'LA') and img.getcolors(maxcolors=256): # 检查图片是否包含少于256种颜色,适合转换为调色板模式
img = img.convert('P', palette=Image.ADAPTIVE) # 转换为256色调色板模式
output_path = os.path.join(output_folder, f"{name}_palette_optimized{ext}") # 修改文件名以区分
img.save(output_path, optimize=optimize)
compressed_size = os.path.getsize(output_path)
print(f"✅ 压缩 '{filename}' (优化: {optimize})")
print(f" 原始大小: {original_size / 1024:.2f} KB")
print(f" 压缩后大小: {compressed_size / 1024:.2f} KB ({((original_size - compressed_size) / original_size) * 100:.2f}% 减小)")
except Exception as e:
print(f"❌ 压缩 '{filename}' 失败:{e}")
if __name__ == "__main__":
# --- 请修改为你的PNG图片路径和输出文件夹路径 ---
source_png_image = os.path.expanduser("E:/lx/pillow.png") # 建议选择一张带有透明背景或颜色较少的PNG
output_compressed_folder_png = os.path.expanduser("E:/lx/Compressed_PNGs")
os.makedirs(output_compressed_folder_png, exist_ok=True)
print("--- 测试PNG图片优化 ---")
compress_png(source_png_image, output_compressed_folder_png, optimize=True)
操作步骤:
准备一张PNG图片,放到桌面,命名为pillow.png。
修改代码中的 source_png_image 和 output_compressed_folder_png。
运行脚本。

得到结论:可能是我选择图片的问题,是有压缩,不显著。
格式转换魔术:Python图片格式自由切换!
除了压缩,图片格式转换也是日常Python图片处理中非常常见的需求。
例如,你需要将JPG转为PNG以获得透明背景,或者将PNG转为JPG以获得更小的文件大小(但会失去透明度)。
Pillow能够读取多种图片格式,并在保存时指定目标格式,即可实现图片格式转换。
JPG转PNG:让你的图片拥有透明背景
你有一些JPG图片,但希望将它们用作Logo或图层,需要透明背景。或者你正在制作Web页面,需要支持透明度的图片格式。
from PIL import Image
import os
def convert_jpg_to_png(image_path, output_folder):
"""
将JPG图片转换为PNG格式。
这是实现图片格式转换的Python方法。
:param image_path: 原始JPG图片路径
:param output_folder: 转换后PNG图片保存的文件夹
"""
if not os.path.exists(image_path):
print(f"❌ 图片文件未找到:'{image_path}'。")
return
os.makedirs(output_folder, exist_ok=True)
filename = os.path.basename(image_path)
name, ext = os.path.splitext(filename)
if ext.lower() not in [".jpg", ".jpeg"]:
print(f"⚠️ 跳过文件:'{filename}',这不是JPG/JPEG格式。")
return
output_path = os.path.join(output_folder, f"{name}.png") # 目标扩展名为.png
try:
img = Image.open(image_path)
# JPG转PNG,通常JPG是RGB模式,PNG支持RGBA(带透明度)
# 如果原始JPG没有透明度信息,转换后PNG默认也无透明度,需要手动添加(更高级操作)
if img.mode == 'RGB':
img = img.convert('RGBA') # 转换为RGBA模式,为添加透明度做准备
img.save(output_path, "PNG") # 指定保存格式为PNG
print(f"✅ 转换成功:'{filename}' (JPG) -> '{os.path.basename(output_path)}' (PNG)")
except Exception as e:
print(f"❌ 转换失败:'{filename}'。错误信息:{e}")
if __name__ == "__main__":
# --- 请修改为你的JPG图片路径和输出文件夹路径 ---
source_jpg_image = os.path.expanduser("E:/lx/pillow.jpeg")
output_converted_folder = os.path.expanduser("E:/lx/Converted_Images")
os.makedirs(output_converted_folder, exist_ok=True)
print("--- 测试JPG转PNG ---")
convert_jpg_to_png(source_jpg_image, output_converted_folder)
操作步骤:
- 准备一张JPG图片,放到桌面,命名为pillow.jpeg。
- 修改代码中的 source_jpg_image 和 output_converted_folder。
- 运行脚本。
效果展示:

PNG转JPG:减小文件大小,适应更多场景
你有一些PNG图片,但并不需要透明背景,希望将其转换为更小巧的JPG格式,以减小文件体积,适应网页、邮件等不要求透明度的场景。
from PIL import Image
import os
def convert_png_to_jpg(image_path, output_folder, quality=85):
"""
将PNG图片转换为JPG格式。
这是实现图片格式转换的Python方法,同时可以进行JPG压缩。
:param image_path: 原始PNG图片路径
:param output_folder: 转换后JPG图片保存的文件夹
:param quality: JPG压缩质量,范围0-100。
"""
if not os.path.exists(image_path):
print(f"❌ 图片文件未找到:'{image_path}'。")
return
os.makedirs(output_folder, exist_ok=True)
filename = os.path.basename(image_path)
name, ext = os.path.splitext(filename)
if ext.lower() != ".png":
print(f"⚠️ 跳过文件:'{filename}',这不是PNG格式。")
return
output_path = os.path.join(output_folder, f"{name}.jpg") # 目标扩展名为.jpg
try:
img = Image.open(image_path)
# PNG转JPG:如果PNG是RGBA模式(带透明度),转换为RGB模式,透明度会被填充为白色
if img.mode == 'RGBA':
# 创建一个白色背景
background = Image.new('RGB', img.size, (255, 255, 255))
# 将PNG图片叠加到白色背景上
background.paste(img, (0, 0), img)
img = background
elif img.mode == 'LA': # 灰度带透明度
img = img.convert('L') # 转换为L模式(灰度)
img.save(output_path, "JPEG", quality=quality) # 指定保存格式为JPEG,并可以进行质量压缩
print(f"✅ 转换成功:'{filename}' (PNG) -> '{os.path.basename(output_path)}' (JPG)")
except Exception as e:
print(f"❌ 转换失败:'{filename}'。错误信息:{e}")
if __name__ == "__main__":
# --- 请修改为你的PNG图片路径和输出文件夹路径 ---
source_png_image = os.path.expanduser("E:/lx/pillow.png")
output_converted_folder = os.path.expanduser("E:/lxConverted_Images")
os.makedirs(output_converted_folder, exist_ok=True)
print("--- 测试PNG转JPG ---")
convert_png_to_jpg(source_png_image, output_converted_folder, quality=85)
操作步骤:
- 准备一张PNG图片,放到桌面,命名为pillow.png。
- 修改代码中的 source_png_image 和 output_converted_folder。
- 运行脚本。
效果展示:

批量处理图片:Python一键搞定整个文件夹,告别手动操作!
你已经学会了对单张图片进行压缩和格式转换。但你的电脑里可能有成千上万张图片散落在各个文件夹中,需要批量处理!一个一个操作?那效率简直是天方夜谭!
将上述的图片处理功能封装起来,然后结合文件遍历,Python就能实现整个文件夹的图片批量处理,包括压缩和格式转换,甚至处理子文件夹中的图片!
这才是真正的Python批量图片处理神器,也是提升图片处理效率的终极奥秘
from PIL import Image
import os
def batch_process_images(source_folder, output_base_folder,
compress_jpg_quality=80, optimize_png=True,
target_format=None): # target_format可以是 "png", "jpg" 或 None
"""
批量压缩并/或转换指定文件夹及其子文件夹下的图片。
这是你的Python批量图片处理自动化方案。
:param source_folder: 包含待处理图片的源文件夹
:param output_base_folder: 处理后图片保存的根文件夹
:param compress_jpg_quality: JPG图片压缩质量 (0-100)
:param optimize_png: PNG图片是否进行优化 (True/False)
:param target_format: 目标转换格式 ("png", "jpg") 或 None (只压缩不转换格式)
"""
if not os.path.exists(source_folder):
print(f"❌ 源文件夹不存在:'{source_folder}'")
return
os.makedirs(output_base_folder, exist_ok=True) # 确保输出根文件夹存在
print(f"\n🚀 正在启动图片批量处理,源目录:'{source_folder}'")
print(f"📦 处理后的图片将保存到:'{output_base_folder}'\n")
processed_count = 0
# os.walk() 遍历文件夹及其子文件夹,实现批量处理图片大小
for root, dirs, files in os.walk(source_folder):
# 构建当前子文件夹在输出目录中的对应路径
relative_path = os.path.relpath(root, source_folder)
current_output_folder = os.path.join(output_base_folder, relative_path)
os.makedirs(current_output_folder, exist_ok=True) # 确保输出子文件夹存在
for filename in files:
file_path = os.path.join(root, filename)
name, ext = os.path.splitext(filename)
ext = ext.lower()
try:
img = None
if ext in [".jpg", ".jpeg", ".png"]: # 只处理JPG和PNG
img = Image.open(file_path)
original_size = os.path.getsize(file_path)
else:
print(f"ℹ️ 跳过文件:'{filename}',不支持的图片格式。")
continue
output_ext = ext # 默认保持原扩展名
output_name_suffix = ""
# 1. 执行格式转换 (如果指定了目标格式)
if target_format == "png" and ext != ".png":
img = img.convert('RGBA') if img.mode == 'RGB' else img # 确保透明度通道
output_ext = ".png"
output_name_suffix = "_converted"
elif target_format == "jpg" and ext != ".jpg" and ext != ".jpeg":
# PNG转JPG,透明度会变白
if img.mode == 'RGBA':
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, (0, 0), img)
img = background
img = img.convert('RGB') # 确保RGB模式
output_ext = ".jpg"
output_name_suffix = "_converted"
# 2. 执行压缩 (根据原格式或转换后的格式)
output_file_path = os.path.join(current_output_folder, f"{name}{output_name_suffix}{output_ext}")
if output_ext in [".jpg", ".jpeg"]:
img.save(output_file_path, "JPEG", quality=compress_jpg_quality)
elif output_ext == ".png":
# 尝试PNG优化到调色板模式
if img.mode in ('RGBA', 'LA') and img.getcolors(maxcolors=256):
img = img.convert('P', palette=Image.ADAPTIVE)
img.save(output_file_path, "PNG", optimize=optimize_png)
compressed_size = os.path.getsize(output_file_path)
print(f"✅ 处理完成: '{filename}' -> '{os.path.basename(output_file_path)}'")
print(f" 原始大小: {original_size / 1024:.2f} KB, 现大小: {compressed_size / 1024:.2f} KB ({((original_size - compressed_size) / original_size) * 100:.2f}% 减小)")
processed_count += 1
except Exception as e:
print(f"❌ 处理文件 '{filename}' 失败:{e}")
print(f"\n✨ 批量图片处理完成!总计处理 {processed_count} 张图片。")
if __name__ == "__main__":
source_folder_path = os.path.expanduser("~/Desktop/我的图片库") # 包含多张图片和子文件夹的目录
output_folder_path = os.path.expanduser("~/Desktop/处理后图片") # 处理后图片保存的目录
# 确保源文件夹有测试图片,可以包含子文件夹和不同格式的图片
os.makedirs(source_folder_path, exist_ok=True)
print("\n--- 示例1:批量压缩图片 (JPG质量80, PNG优化) ---")
batch_process_images(source_folder_path, os.path.join(output_folder_path, "Compressed"),
compress_jpg_quality=80, optimize_png=True, target_format=None)
print("\n--- 示例2:批量将图片转换为PNG格式 (同时优化PNG) ---")
# 先清理上次生成的目录
if os.path.exists(os.path.join(output_folder_path, "Converted_PNG")):
shutil.rmtree(os.path.join(output_folder_path, "Converted_PNG"))
batch_process_images(source_folder_path, os.path.join(output_folder_path, "Converted_PNG"),
compress_jpg_quality=80, optimize_png=True, target_format="png")
操作步骤:
准备数据: 创建一个名为我的图片库的文件夹,放入一些JPG和PNG图片,可以在里面再建几个子文件夹,放入更多图片。
修改代码路径: 修改 source_folder_path 和 output_folder_path。
运行: 运行脚本,可以尝试修改 batch_process_images 的 target_format 参数(“png”, “jpg”, None)来测试不同功能。

总结与展望:你的专属图片瘦身神器,告别“慢时代”
恭喜你!通过本篇文章,你已经成功掌握了Python图片处理的终极奥义,亲手打造了一个强大的Python批量图片处理神器!我们从图片体积太大、加载慢、传输卡顿的痛点出发,
学会了:
- Pillow库入门: 你的Python图片处理瑞士军刀,轻松应对各种图像操作。
- JPG秒速瘦身: 精准控制quality参数,在不损失肉眼可见质量的前提下,大幅减小文件体积,彻底解决图片加载慢的烦恼。
- PNG无损优化: optimize=True让你的PNG图片在保持高质量和透明度的同时“减重”。
- 图片格式转换: 轻松实现JPG转PNG、PNG转JPG等多种图片格式转换,适应各种应用场景。
- 批量处理能力: Python批量图片处理能力,一键扫描并处理整个文件夹及其子文件夹下的所有图片,彻底提升图片处理效率
以上就是Python实现图片批量压缩和格式转换的终极指南的详细内容,更多关于Python图片处理的资料请关注脚本之家其它相关文章!
相关文章
Python 管理依赖包工具pip, virtualenv详解
管理依赖包是Python开发中不可或缺的一部分,通过pip、virtualenv和pipenv等工具,我们可以有效地管理包和虚拟环境,确保项目的可移植性和一致性,这篇文章主要介绍了Python 管理依赖包(pip, virtualenv),需要的朋友可以参考下2024-07-07
python中内置函数ord()返回字符串的ASCII数值实例详解
ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,这篇文章主要介绍了python 中内置函数ord()返回字符串的ASCII数值,需要的朋友可以参考下2022-07-07


最新评论