一个完全本地运行的 Windows 图片工具:先看清图(查看器),再把文件压小(压缩器)。图片不上传任何服务器,全程在你自己的机器上完成。
代码注释和本文保留了若干实测数据与踩过的坑,供学习参考。
压缩
- 把一张图片压小,并如实告诉你压了多少
- 三个档位:小体积 / 均衡 / 高画质
- 可选限制输出尺寸(只缩小,不放大)
- 压不小就明确报错,绝不产出比原图更大的文件
- 保持原格式时可以大幅压缩(PNG 走调色板减色)
查看(拖放区点「查看图片」,或双击预览框)
- 打开一个文件即浏览它所在的文件夹:底部缩略图条、上一张/下一张(←/→ 键)
- 适应窗口 / 1:1 / 滚轮以鼠标为中心缩放 / 拖动平移 / 双击复位
- 旋转查看(只改视图,不写回文件)
- GIF 动图播放(空格暂停),F11 全屏(Esc 先退全屏)
- 删除当前图:确认后移入回收站,可恢复
- 看中哪张,点「压缩这张」直接送进压缩主窗口
- 放大再多也只渲染可见区域;左右邻居自动预读,翻页秒开
可读取 JPEG / PNG / WebP / BMP / GIF / TIFF。
双击 dist/图片压缩工具.exe,无需安装 Python。
首次启动会慢一两秒 —— 单文件打包的程序需要先把自己解压到临时目录。
需要 Python 3.13 和 Pillow:
pip install pillow
python main.pypip install pyinstaller
pyinstaller --onefile --windowed --clean --paths . \
--name 图片压缩工具 --distpath dist \
--workpath build/gui_work --specpath build main.py产物在 dist/图片压缩工具.exe(约 17 MB)。
python -m unittest discover -s tests测试样本图片全部现场合成,不依赖任何外部文件。
用 --windowed 打的界面程序没有任何控制台输出 —— 万一 Pillow 的 WebP 支持
(依赖额外 DLL)没被打包进去,界面照样能开,只是用到时候才失败,在开发机上完全看不出来。
所以另有一个冒烟测试程序,单独以控制台方式打包:
pyinstaller --onefile --console --clean --paths . \
--name smoke --distpath build/smoke \
--workpath build/smoke_work --specpath build tests/frozen_smoke.py
build/smoke/smoke.exe它会打印编解码能力,并把每条编码路径实跑一遍。
「压缩」不是一种统一的算法,而是两种完全不同的机制:
- 有损(JPEG / WebP):丢掉人眼不敏感的高频细节,
quality就是这个「丢多少」的旋钮。 - 无损(PNG / WebP 无损):只寻找数据里的重复模式。压缩率完全取决于图片本身有多可预测。
由此推出两条容易被忽略的结论:
- 对照片而言,PNG 几乎压不动。照片存成 PNG 时重新优化只能省 2~5%,甚至可能变大 —— 因为 DEFLATE 已经对它生效过一遍了。
- 对截图 / 插画而言,JPEG 会让文件变大。实测把一张界面截图转成 JPEG,体积涨到原图的 938%。因为 JPEG 的块效应在大片纯色边缘制造噪点,反而增加了信息量。
本工具的做法是不猜图片类型,直接比较各方案实际产出的体积,取最小的那个。
- 压缩只处理单张图片,没有批量
- 大图(4000×3000 以上)压缩可能要等几秒,目前只有不确定进度的进度条 (Pillow 不提供编码进度回调)
- 查看器不递归子文件夹;GIF 帧数 × 像素超上限时只显示第一帧
- 没有做文件关联 / 右键「打开方式」(需安装器,属产品级决定)
当前版本 1.3.0,变更记录见 CHANGELOG.md。