983 字
5 分钟
自动压缩png图片脚本
2026-02-24

前言#

这是一个用AI,加上我自己的一些修改写的一个小脚本,能快速帮你压缩一些图片

最初的想法就是解决GitHub仓库超过一定文件大小就会被警告的问题,加上需要优化网站的打开速度,图片加载速度,减少图床的流量

如果你也需要,请继续往下看

代码主要内容#

以下是代码,请将他们保存再一个.py的文件

因为他们可以自定义文件夹路径或直接压缩当前目录的缘故,你可以将它放在任意一个目录,或者放在你存放图片的目录

静态网页容易将资源文件夹识别为静态资源,由于无法识别.py文件,容易报错,所以这种情况请将它放在其他目录

import os
import sys
from PIL import Image
def compress_png_images_recursive(root_directory, quality=85, optimize=True):
"""
递归压缩指定根目录下所有子文件夹中的PNG图片(如img/001/P1.png)
保持原文件名、原路径不变,无需修改Markdown中的图片链接
Args:
root_directory (str): 根目录(比如存放所有img子文件夹的目录)
quality (int): PNG压缩质量(1-95)
optimize (bool): 是否启用PNG优化
"""
# 检查根目录是否存在
if not os.path.isdir(root_directory):
print(f"❌ 错误:根目录 {root_directory} 不存在!")
return
# 统计变量
processed_count = 0
total_original_size = 0
total_compressed_size = 0
# 递归遍历所有子目录和文件
for root, dirs, files in os.walk(root_directory):
for filename in files:
# 只处理PNG文件
if not filename.lower().endswith('.png'):
continue
# 拼接完整文件路径(如 img/001/P1.png)
file_path = os.path.join(root, filename)
try:
# 获取原始文件大小
original_size = os.path.getsize(file_path)
total_original_size += original_size
# 打开并压缩PNG图片(直接覆盖原文件,路径/名称不变)
with Image.open(file_path) as img:
img.save(
file_path,
format='PNG',
quality=quality,
optimize=optimize,
compress_level=9 # PNG最高压缩级别
)
# 获取压缩后的文件大小
compressed_size = os.path.getsize(file_path)
total_compressed_size += compressed_size
# 计算压缩率
compression_ratio = (1 - compressed_size / original_size) * 100
# 输出压缩信息(显示相对路径,更清晰)
relative_path = os.path.relpath(file_path, root_directory)
print(f"✅ 已压缩:{relative_path}")
print(f" 原大小:{original_size/1024:.2f} KB → 压缩后:{compressed_size/1024:.2f} KB")
print(f" 压缩率:{compression_ratio:.2f}%\n")
processed_count += 1
except Exception as e:
relative_path = os.path.relpath(file_path, root_directory)
print(f"❌ 处理 {relative_path} 失败:{str(e)}\n")
# 输出汇总信息
print("="*60)
print(f"📊 递归压缩完成!共处理 {processed_count} 个PNG文件")
if processed_count > 0:
total_ratio = (1 - total_compressed_size / total_original_size) * 100
print(f"📈 总原始体积:{total_original_size/1024:.2f} KB")
print(f"📉 总压缩体积:{total_compressed_size/1024:.2f} KB")
print(f"🎯 整体压缩率:{total_ratio:.2f}%")
if __name__ == "__main__":
# 方式1:命令行传参指定根目录(比如存放img文件夹的目录)
if len(sys.argv) > 1:
root_dir = sys.argv[1]
# 方式2:默认使用当前目录(脚本所在目录)
else:
root_dir = os.getcwd()
print(f"ℹ️ 未指定目录,处理当前目录:{root_dir}\n")
# 执行递归压缩(quality=85适配博客场景)
compress_png_images_recursive(root_dir, quality=85)
# ========== 关键新增:让窗口停留 ==========
print("\n" + "="*60)
print("✅ 所有操作完成!按回车键关闭窗口...")
# 等待用户输入(按回车才会关闭)
input()

代码使用方式#

上面也写了有两种方式,下面细讲

方法一:直接扫描当前目录下的图片#

  • 保存这些代码在一个.py文件里面

  • 双击这个.py文件

  • 等待之后,会输出压缩情况

压缩后,文件名,文件格式,文件位置都不会变化

方法二:指定文件路径:使用终端或者BAT启动#

终端的格式:

python 脚本文件名.py "img"

示例的BAT脚本:

@python "%~dp0Compress images.py" "%~dp0../src/content/img/"

Compress images.py是我的脚本文件名

../src/content/img/是我图片的路径也是需要压缩的路径

注意事项#

脚本并没有自动备份功能,请压缩重要图片时备份,脚本没有任何后门,请放心使用

请使用脚本前备份你的文件,以免发生意外

如果你使用我的脚本发生了文件丢失的情况,一切与我无关,所有后果由您承担

自动压缩png图片脚本
https://131124.xyz/posts/023-自动压缩png图片脚本/
作者
IKUN_3058
发布于
2026-02-24
许可协议
CC BY-NC-SA 4.0