前言
你的工作生活中,是不是也经常遇到这些令人抓狂的场景?发送邮件时,附件里的图片体积太大,导致邮件发不出去或等待漫长,上传网站或社交媒体,图片加载速度慢如蜗牛,用户流失,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图片处理的资料请关注代码网其它相关文章!
发表评论