当前位置: 代码网 > it编程>前端脚本>Python > Python实现图片批量压缩和格式转换的终极指南

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

2025年12月03日 Python 我要评论
前言你的工作生活中,是不是也经常遇到这些令人抓狂的场景?发送邮件时,附件里的图片体积太大,导致邮件发不出去或等待漫长,上传网站或社交媒体,图片加载速度慢如蜗牛,用户流失,seo排名受影响。ppt或报告

前言

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com