983 字
5 分钟
自动压缩png图片脚本
前言
这是一个用AI,加上我自己的一些修改写的一个小脚本,能快速帮你压缩一些图片
最初的想法就是解决GitHub仓库超过一定文件大小就会被警告的问题,加上需要优化网站的打开速度,图片加载速度,减少图床的流量
如果你也需要,请继续往下看
代码主要内容
以下是代码,请将他们保存再一个.py的文件
因为他们可以自定义文件夹路径或直接压缩当前目录的缘故,你可以将它放在任意一个目录,或者放在你存放图片的目录
静态网页容易将资源文件夹识别为静态资源,由于无法识别.py文件,容易报错,所以这种情况请将它放在其他目录
import osimport sysfrom 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图片脚本/