Python+Tinify实现高效批量压缩图片

 更新时间:2025年02月24日 11:03:24   作者:小小续  
这篇文章主要为大家详细介绍了Python如何利用Tinify实现高效批量压缩图片功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

webpack本身可以压缩图片image-webpack-loader,但是打包时间长,图片是有损压缩为了图片质量采用Python tinify库脚本压缩

以下是一个基于 PythonTinify(TinyPNG)库的图片压缩脚本,它可以 递归压缩 指定目录下的所有 JPG、PNG 和 WebP 图片,并 统计压缩前后的总大小及节省的空间

一、代码功能

  • 遍历目录及其子目录,查找 jpgpngwebp 图片文件
  • 使用 Tinify API 进行无损压缩,保证图片质量
  • 输出压缩前后大小对比,显示节省空间
  • 跳过已压缩的图片,避免重复操作

二、Python 代码

import os
import sys
import tinify

# 设置 Tinify API Key(请自行到 https://tinypng.com/developers 获取)
TINIFY_API_KEY = "your_tinify_api_key"
tinify.key = TINIFY_API_KEY

# 支持的图片格式
SUPPORTED_FORMATS = (".jpg", ".jpeg", ".png", ".webp")

# 递归压缩图片
def compress_images_in_directory(directory):
    total_original_size = 0
    total_compressed_size = 0
    compressed_count = 0

    # 遍历目录及子目录
    for root, _, files in os.walk(directory):
        for file in files:
            if file.lower().endswith(SUPPORTED_FORMATS):  # 仅处理指定格式的图片
                file_path = os.path.join(root, file)
                original_size = os.path.getsize(file_path)  # 获取原始文件大小

                try:
                    # 压缩图片
                    source = tinify.from_file(file_path)
                    source.to_file(file_path)
                    
                    compressed_size = os.path.getsize(file_path)  # 获取压缩后大小
                    compressed_count += 1
                    total_original_size += original_size
                    total_compressed_size += compressed_size

                    # 输出压缩日志
                    saved_size = original_size - compressed_size
                    print(f"✅ 压缩成功: {file_path} | 节省 {saved_size / 1024:.2f} KB")
                except tinify.errors.AccountError:
                    print("❌ 账户验证失败,请检查 API Key 是否正确")
                    sys.exit(1)
                except tinify.errors.ClientError:
                    print(f"❌ 无法处理图片: {file_path}")
                except tinify.errors.ServerError:
                    print("❌ TinyPNG 服务器错误,稍后再试")
                except Exception as e:
                    print(f"❌ 发生错误: {e}")

    # 总结压缩结果
    if compressed_count > 0:
        saved_space = total_original_size - total_compressed_size
        print("\n📊 压缩统计:")
        print(f"- 处理图片数量: {compressed_count}")
        print(f"- 压缩前总大小: {total_original_size / 1024:.2f} KB")
        print(f"- 压缩后总大小: {total_compressed_size / 1024:.2f} KB")
        print(f"- 总共节省空间: {saved_space / 1024:.2f} KB")
    else:
        print("⚠️ 未找到需要压缩的图片")

# 获取命令行参数(目标目录)
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("❌ 请输入要压缩的目录路径")
        sys.exit(1)

    target_directory = sys.argv[1]
    
    if not os.path.isdir(target_directory):
        print("❌ 指定的路径不是一个有效目录")
        sys.exit(1)

    print(f"🚀 开始压缩目录: {target_directory}\n")
    compress_images_in_directory(target_directory)

三、如何使用

安装依赖

pip install tinify

获取 Tinify API Key

  • 到 TinyPNG API(tinypng.com/developers) 申请开发者 API Key
  • TINIFY_API_KEY = "your_tinify_api_key" 替换成你的 API Key

运行脚本

python compress_images.py "/your/image/directory"

例如:

python compress_images.py "./images"

四、代码优化点

自动递归处理子目录

检查图片格式,避免处理非图片文件

异常处理(API 错误、服务器异常、无效路径)

输出详细的压缩信息,统计节省空间

避免重复压缩

五、运行效果示例

🚀 开始压缩目录: ./images

✅ 压缩成功: ./images/photo1.jpg | 节省 45.3 KB
✅ 压缩成功: ./images/photo2.png | 节省 30.7 KB
✅ 压缩成功: ./images/subdir/photo3.webp | 节省 25.1 KB

📊 压缩统计:
- 处理图片数量: 3
- 压缩前总大小: 512.3 KB
- 压缩后总大小: 411.2 KB
- 总共节省空间: 101.1 KB

这样,你就可以 在 Webpack 构建前手动使用 Python 脚本批量压缩图片,减少 Webpack 打包时间,同时保持高画质

到此这篇关于Python+Tinify实现高效批量压缩图片的文章就介绍到这了,更多相关Python压缩图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 时间操作datetime详情

    Python 时间操作datetime详情

    这篇文章主要介绍了 Python 时间操作datetime,datetime 模块提供处理时间和日期的多种类,简单方便,下面文章将详细介绍其内容,需要的朋友可以参考一下
    2021-11-11
  • Gradio机器学习模型快速部署工具接口状态

    Gradio机器学习模型快速部署工具接口状态

    这篇文章主要为大家介绍了Gradio机器学习模型快速部署工具接口状态的原文翻译,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python drop()删除行列的操作方法

    Python drop()删除行列的操作方法

    这篇文章主要介绍了Python drop()删除行列的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Python面向对象编程之类的封装

    Python面向对象编程之类的封装

    这篇文章主要介绍了Python面向对象编程之类的封装封装指属性和方法的抽象,属性的抽象又指对类的属性进行定义、隔离和保护,下面来看看文章的具体内容吧,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • 更新升级python和pip版本后不生效的问题解决

    更新升级python和pip版本后不生效的问题解决

    这篇文章主要介绍了更新升级python和pip版本后不生效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 详解Python最长公共子串和最长公共子序列的实现

    详解Python最长公共子串和最长公共子序列的实现

    这篇文章主要介绍了详解Python最长公共子串和最长公共子序列的实现。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Python中列表的高级索引技巧分享

    Python中列表的高级索引技巧分享

    列表是 Python 中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解 Python 列表的高级索引技巧,希望对大家有所帮助
    2025-01-01
  • pandas中字典和dataFrame的相互转换

    pandas中字典和dataFrame的相互转换

    有时候需要把dic转换为DataFrame格式,便于查看和存储,下面这篇文章主要给大家介绍了关于pandas中字典和dataFrame相互转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Python中__str__()方法的实用技巧分享

    Python中__str__()方法的实用技巧分享

    在Python编程中,__str__()是一个特殊方法,它允许自定义对象的字符串表示形式,本文将深入探讨__str__()的相关实用技巧,希望对大家有所帮助
    2023-11-11
  • Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统

    这篇文章主要介绍了Python实现12306火车票抢票系统,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07

最新评论