开发者

Python实现图片批量无损压缩脚本

开发者 https://www.devze.com 2025-08-21 09:28 出处:网络 作者: 幽络源小助理
目录概述压缩脚本脚本使用安装必备库使用脚本查看结果概述 随着站点的内容越来越多,图片所占据项目的空间越来越大,需要开始考虑到幽络源图像的压缩了,本教程将会提供一个图像的压缩脚本来实现对png、jpg、jpeg、w
目录
  • 概述
  • 压缩脚本
  • 脚本使用
    • 安装必备库
    • 使用脚本
  • 查看结果

    概述

    随着站点的内容越来越多,图片所占据项目的空间越来越大,需要开始考虑到幽络源图像的压缩了,本教程将会提供一个图像的压缩脚本来实现对png、jpg、jpeg、webp图像的压缩,另外试过自己压缩图像的用户可能会特别注意png的压缩,png是一种无损图像,普通的pillow库已不足以实现对png的压缩,本教程所提供脚本同样适用于png的压缩。

    压缩脚本

    import os
    import sys
    from PIL import Image
    import subprocess
    def compress_png_aggressively(input_path, quality):
        """直接覆盖源文件的PNG编程客栈压缩方案"""
        try:
            # 1. 使用pngquant直接覆盖源文件(添加--speed 1加快速度)
            subprocess.run([
                "pngquant",
                "--force",
                "--speed", "1",  # 加速处理
                "--quality", f"{max(10, 100 - quality)}-100",
                "--output", input_path,  # 直接输出到原文件
                "--",
                input_path
            ], check=True)
            # 2. 直接运行optipng覆盖原文件(添加-clobber覆盖写入)
            subprocess.run([
                "optipng",
                "-o5",
                "-quiet",
                "-clobber",  # 允许覆盖原文件
                input_path
            ], check=True)
        except subprocess.CalledProcessError as e:
            print(f"压缩失败(已保留原文件): {e}")
        except Exception as e:
            print(f"未知错误: {e}")
    def compress_image_by_quality(input_path, quality):
        """
        按质量压缩图片并覆盖原文件
        :param input_path: 图片路径
        :param quality: 压缩质量 (0-100)
        """
        if not os.path.isfile(input_path):
            print(f"文件不存在: {input_path}")
            return
        file_ext = os.path.splitext(input_path)[1].lower()
        supported_formats = ['.jpg', '.jpeg', '.png', '.webp']
        if 编程客栈file_ext not in supported_formats:
            print(f"不支持的图片格式: {input_path}")
            return
        original_size = os.path.getsize(input_path) / 1024  # KB
        try:
            if file_ext in ['.jpg', '.jpeg']:
                img = Image.open(input_path)
                img.save(input_path, quality=quality, optimize=True, progressive=True)
            elif file_ext == '.png':
                # 对PNG使用强力压缩
                compress_png_aggressively(input_path, quality)
            elif file_ext == '.webp':
                img = Image.open(input_path)
                img.save(input_path, quality=quality, method=6)
            compressed_size = os.path.getsize(input_path) / 1024
            print(
                f"压缩完成: {os.path.basename(input_path)} 质量: {quality} 大小: {original_size:.2f}KB -> {compressed_size:.2f}KB")
        except Exception as e:
            print(f"压缩过程中出错: {e}")
    def compress_images_in_directory(directory, quality):
        """
        压缩目录下的所有图片
        :param directory: 目录路径
        :param quality: 压缩质量 (0-100)
        """
        if not os.path.isdir(directory):
            print(f"目录不存在: {directory}")
            return
        print(f"开始压缩目录: {directory},质量设置: {quality}")
        for filename in os.listdir(directory):
            filepath = os.path.join(directory, filename)
            if os.path.isfile(filepath):
                compress_image_by_quality(filepath, quality)
        print("所有图片压缩完成")
    if __name__ == "__main__":
        # 检查必要工具是否安装
        try:
            subprocess.run(["pngquant", "--version"], check=True, stdout=subprocess.PIPE)
            subprocess.run(["optipng", "--version"], check=True, stdout=subprocess.PIPE)
        except:
            print("警告: 请先安装pngquant和optipng以获得最佳PNG压缩效果")
            print("Ubuntu/Debian: sudo apt-get install pngquant optipng")
            print("Centos/RHEL: sudo yum install pngquant optipng")
            print("MACOS: brew install pngquant optipng")
            sys.exit(1)  # 工具未安装时直接退出
        directory = r"/www/wwwroot/www.youluoyuan.com/wp-content/uploads/2025/01" #含有图片的目录
        try:
            quality = 60 #压缩质量 范围1~100,建议50~75,数字越小则压缩越强,但图片质量会更低
            if not 0 <= quality <= 100:
                raise ValueError
        except ValueError:
            print("错误: 质量参数必须是0到100之间的整数")
        http://www.devze.com    sys.exit(1)
        try:
            compress_images_in_directory(directory, quality)
            print("\n✅ 已全部压缩完成")  # 新增完成提示
            sys.exit(0)  # 正常退出
        except Exception as e:
            print(f"\n❌ 压缩过程中发生严重错误: {e}")
            sys.exit(1)  # 异常退出

    脚本解释

    在上面的脚本中

    directory是指包含图片的目录,Windows与linux系统都可以

    quality表示期望压缩的质量,范围1~100,建议50~75,数字越小则压缩越强,但图片质量会更低

    脚本使用

    安装必备库

    对于linux系统,执行如下对应命令即可安装pngquant、optipng库,这两个库主要是特定针对png的压缩

    # Ubuntu/Debian
    sudo apt-get install pngquant optipng
    # CentOS/RHEL
    sudo yum install pngquant optipng
    # MacOS
    brew install pngquant optipng

    对于Windows系统,方式之一是手动下载pngquant、optipng并配置环境变量,幽络源这里已提供适用于windows的pngquant、optipng库

    按照如图快捷进入环境变量配置

    Python实现图片批量无损压缩脚本

    再将optipng和pngquant配置到path中去,如图

    Python实现图片批量无损压缩脚本

    配置保存后,在cmd命令中输js入如下两条命令

    pngquant --version
    optipng -version

    若成功则能获取到相应的版本信息,如图

    Python实现图片批量无损压缩脚本

    使用脚本

    以如下包含图片的目录为例,现在大小如下为104MB

    Python实现图片批量无损压缩脚本

    www.devze.com修改脚本中指定的目录和期望的压缩质量,如图

    Python实现图片批量无损压缩脚本

    执行后,开始自动批量压缩,输出如下

    Python实现图片批量无损压缩脚本

    查看结果

    压缩后结果如下,并且图像的实际质量也不低,能够极大的减少图像占据磁盘空间。

    Python实现图片批量无损压缩脚本

    到此这篇关于python实现图片批量无损压缩脚本的文章就介绍到这了,更多相关Python图片压缩内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号