Python实现图片批量压缩和格式转换的终极指南

 更新时间:2025年12月03日 09:50:50   作者:爱分享的飘哥  
这篇文章将继续揭示Python图片处理自动化的强大魔力,手把手教你如何打造一个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编写录屏录音工具

    使用Python编写录屏录音工具

    这篇文章主要为大家详细介绍了如何使用Python编写一个录屏录音工具,工具界面十分简单,默认是全屏录屏录音,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Python 管理依赖包工具pip, virtualenv详解

    Python 管理依赖包工具pip, virtualenv详解

    管理依赖包是Python开发中不可或缺的一部分,通过pip、virtualenv和pipenv等工具,我们可以有效地管理包和虚拟环境,确保项目的可移植性和一致性,这篇文章主要介绍了Python 管理依赖包(pip, virtualenv),需要的朋友可以参考下
    2024-07-07
  • Python 点击指定位置验证码破解的实现代码

    Python 点击指定位置验证码破解的实现代码

    这篇文章主要介绍了Python 点击指定位置验证码破解的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python定时采集摄像头图像上传ftp服务器功能实现

    python定时采集摄像头图像上传ftp服务器功能实现

    本文程序实现python定时采集摄像头图像上传ftp服务器功能,大家参考使用吧
    2013-12-12
  • opencv基于Haar人脸检测和眼睛检测

    opencv基于Haar人脸检测和眼睛检测

    这篇文章主要为大家详细介绍了opencv基于Haar人脸检测和眼睛检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python图像处理之透视变换的实战应用

    Python图像处理之透视变换的实战应用

    透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping),下面这篇文章主要给大家介绍了关于Python图像处理之透视变换的相关资料,需要的朋友可以参考下
    2021-08-08
  • python将文本分每两行一组并保存到文件

    python将文本分每两行一组并保存到文件

    这篇文章主要介绍了python将文本分每两行一组并保存到文件,需要的朋友可以参考下
    2018-03-03
  • Python使用openpyxl模块处理Excel文件

    Python使用openpyxl模块处理Excel文件

    这篇文章介绍了Python使用openpyxl模块处理Excel文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • python中内置函数ord()返回字符串的ASCII数值实例详解

    python中内置函数ord()返回字符串的ASCII数值实例详解

    ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,这篇文章主要介绍了python 中内置函数ord()返回字符串的ASCII数值,需要的朋友可以参考下
    2022-07-07
  • Python基础学习之深浅拷贝问题及递归函数练习

    Python基础学习之深浅拷贝问题及递归函数练习

    在实际工作中,经常涉及到数据的传递。这篇文章主要为大家介绍了Python的一些基础学习:深拷贝与浅拷贝问题、递归函数的练习,需要的朋友可以参考一下
    2021-12-12

最新评论