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

作者:

文章目录
  • 你的工作生活中,是不是也经常遇到这些令人抓狂的场景?发送邮件时,附件里的图片体积太大,导致邮件发不出去或等待漫长,上传网站或社交媒体,图片加载速度慢如蜗牛,用户流失,SEO排名受影响。PPT或报告里插入大量高清图片,文件大小瞬间爆炸,传输和分享都困难。 面对这些重复且耗时的图片批量压缩和图片格式转换任务,你是不是也想告别手动压缩和转换,寻找一个更智能、更高效的解决方案? 今天,我将继续揭示Python图片处理自动化的强大魔力,手把手教你如何打造一个Python图片处理神器,让你一键提升图片传输与加载效率! 我们将深度掌握图片瘦身的秘诀,并实现多种图片格式转换, 准备好了吗?让我们一起把你的图片瞬间“瘦身”,成为办公室里的效率神器!
  • 还是它,上文基础的操作我们已经讲过了,它也可以轻松完成图片的打开、保存、格式转换、缩放、裁剪,当然也包括我们最关心的——图片瘦身! 现在,我们直奔主题——Python批量图片压缩!Pillow提供了非常简单的参数,就能让你在图片大小和质量之间找到最佳平衡点,让你的图片秒速瘦身! 我们将重点讲解JPG和PNG这两种最常见的图片格式。 JPG压缩(有损): 通过调整quality参数(0-100),在视觉效果可接受的前提下,牺牲少量图片细节来换取文件体积的巨大缩减。质量越低,文件越小。 PNG压缩(无损优化): PNG主要通过优化编码方式和调色板(如果图片颜色较少)来减小体积,而不是像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参数带来的文件大小变化,并对比图片质量。 重点必须是大图:才有意思,否则反而变大!!!!
  • 你的网页或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图片处理中非常常见的需求。 例如,你需要将JPG转为PNG以获得透明背景,或者将PNG转为JPG以获得更小的文件大小(但会失去透明度)。 Pillow能够读取多种图片格式,并在保存时指定目标格式,即可实现图片格式转换。
  • 你已经学会了对单张图片进行压缩和格式转换。但你的电脑里可能有成千上万张图片散落在各个文件夹中,需要批量处理!一个一个操作?那效率简直是天方夜谭! 将上述的图片处理功能封装起来,然后结合文件遍历,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批量处理PDF图片的操作指南(插入、压缩、提取、替换、分页、旋转、删除) 基于Python实现一个图片压缩工具 使用python如何对图片进行压缩 Python使用PIL实现图片的批量格式转换 利用Python实现批量转换图片格式 基于Python实现图片格式批量转换器
  • 目录
    • 前言
    • 核心工具:Python Pillow库
    • JPG图片瘦身:调整质量参数,体积瞬间缩小
    • PNG图片瘦身:无损优化,保持最佳质量!
    • 格式转换魔术:Python图片格式自由切换!
      • JPG转PNG:让你的图片拥有透明背景
      • PNG转JPG:减小文件大小,适应更多场景
    • 批量处理图片:Python一键搞定整个文件夹,告别手动操作!
      • 总结与展望:你的专属图片瘦身神器,告别“慢时代”

        你的工作生活中,是不是也经常遇到这些令人抓狂的场景?发送邮件时,附件里的图片体积太大,导致邮件发不出去或等待漫长,上传网站或社交媒体,图片加载速度慢如蜗牛,用户流失,SEO排名受影响。PPT或报告里插入大量高清图片,文件大小瞬间爆炸,传输和分享都困难。

        面对这些重复且耗时的图片批量压缩和图片格式转换任务,你是不是也想告别手动压缩和转换,寻找一个更智能、更高效的解决方案?

        今天,我将继续揭示Python图片处理自动化的强大魔力,手把手教你如何打造一个Python图片处理神器,让你一键提升图片传输与加载效率!

        我们将深度掌握图片瘦身的秘诀,并实现多种图片格式转换,

        准备好了吗?让我们一起把你的图片瞬间“瘦身”,成为办公室里的效率神器!

        还是它,上文基础的操作我们已经讲过了,它也可以轻松完成图片的打开、保存、格式转换、缩放、裁剪,当然也包括我们最关心的——图片瘦身!

        现在,我们直奔主题——Python批量图片压缩!Pillow提供了非常简单的参数,就能让你在图片大小和质量之间找到最佳平衡点,让你的图片秒速瘦身!

        我们将重点讲解JPG和PNG这两种最常见的图片格式。

        JPG压缩(有损): 通过调整quality参数(0-100),在视觉效果可接受的前提下,牺牲少量图片细节来换取文件体积的巨大缩减。质量越低,文件越小。

        PNG压缩(无损优化): PNG主要通过优化编码方式和调色板(如果图片颜色较少)来减小体积,而不是像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参数带来的文件大小变化,并对比图片质量。

        重点必须是大图:才有意思,否则反而变大!!!!

        你的网页或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图片处理中非常常见的需求。

        例如,你需要将JPG转为PNG以获得透明背景,或者将PNG转为JPG以获得更小的文件大小(但会失去透明度)。

        Pillow能够读取多种图片格式,并在保存时指定目标格式,即可实现图片格式转换。

        你有一些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格式,以减小文件体积,适应网页、邮件等不要求透明度的场景。

         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批量图片处理神器,也是提升图片处理效率的终极奥秘

        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批量处理PDF图片的操作指南(插入、压缩、提取、替换、分页、旋转、删除)
        • 基于Python实现一个图片压缩工具
        • 使用python如何对图片进行压缩
        • Python使用PIL实现图片的批量格式转换
        • 利用Python实现批量转换图片格式
        • 基于Python实现图片格式批量转换器

        站内搜索