
这个工具解决什么问题
现在拿图片问 AI 是常事:拍一张合同、截一段报错、把商品图丢进去问文案。问题在于手机和相机拍出来的图越来越大,一张 4000×3000 的照片少说四五 MB,有些对话产品单个附件只收 2 MB,一次传五六张更是直接顶到上限。于是要么反复重拍,要么把图一张张丢进在线压缩网站——而那些网站要求先把原图上传,截图里可能有订单号、聊天记录、后台界面,传出去心里不踏实。其实压缩这件事完全可以在本机做完:只要把长边缩到模型真正会用的那个尺寸、把体积压到限制以内,画质肉眼几乎看不出差别,而文件能小一个数量级。缺的只是一个「批量丢进去、一次出结果」的小工具。
- 原来的做法:一张张用看图软件另存、或者打开在线压缩站上传等结果;有的站还限张数、要注册、压完还带水印。几十张图处理完要小半天,中间还得反复核对哪张压过、哪张没压。
- 用这个工具:把图片或整个文件夹拖进窗口,选好长边与体积上限,点一次「开始压缩」,直接输出一套符合规格的图片。格式默认交给工具判断——照片挑 JPEG、白底截图挑 PNG,哪个小用哪个。每张图压缩前后的大小、画质参数、省了多少都写在列表里。
- 省下来的:单张图从「打开—另存—调参数—导出」的一两分钟压到一秒以内;一批三十张图一轮跑完,不用盯着。演示的 6 张图(5.6 MB,含 3 张手机尺寸照片、2 张截图、1 张透明 LOGO)一轮跑完是 572 KB,整批小了 90%,而且三种图各自挑到了对自己最有利的格式。压缩全程在本机完成,图片不会离开电脑。
技术实现
选 C# + .NET Framework 4.8 的直接原因是解码与编码:用户给的素材大概率是手机拍的 JPEG,而 Python 标准库根本解不了 JPEG,要解就得多带一个第三方图像库,exe 体积和不确定性都会上去。Windows 自带的 System.Drawing 对 JPEG/PNG/BMP/GIF/TIFF 全都能读能写,还暴露了 JPEG 的质量参数,正好是本工具最需要的旋钮。编译出来是一个几十 KB 的单文件 exe,Windows 10 1803 之后 .NET Framework 4.8 属于系统组件,用户不需要装任何运行时。整套逻辑是纯 CPU 的像素重采样与编码,不联网、不调用任何在线接口,图片从头到尾留在本机。
- 体积控制:在质量区间上二分,而不是「压一次看看」:JPEG 的体积随质量单调递增,所以「不超过 N 字节的最高质量」可以用二分稳定求出来,7 次编码内必定收敛。实现上先按质量上限编一次——上限给 4 MB 时一次就够,只有真的放不下才进入二分,避免为了一张图白跑七遍。若连最低质量(45)仍超出上限,就按 85% 逐轮缩长边再二分,最多三轮;仍放不下则在状态列里如实写「已压到最低质量与最小尺寸,仍略超上限」,不假装成功。
- 格式不是「选什么存什么」:JPEG 与 PNG 都编一份再挑:这是本工具最关键的一个判断。JPEG 用 DCT 变换,对大面积纯色与锐利文字并不友好——一张 28 KB 的白底截图转成 JPEG 会变成 98 KB,因为干净的色块被糊出一圈噪声,反而更费字节;而无损的 PNG 对这类图可以用极少的字节表达。所以「自动」模式会先查像素里到底有没有真的半透明(有就必须 PNG,否则透明底会被压成黑块),没有就把 JPEG 与 PNG 各编一份、挑体积小的那个。演示里 3 张手机照片走 JPEG(省 91-92%),2 张截图走 PNG(省 22%-47%),各得其所。
- 缩放只缩不放,且只超出一点点时不缩:目标尺寸取「长边不超过 N」的等比结果,原图本来就小于 N 时原样保留——放大不会多出信息,只会多出体积。另外设了 5% 的免缩区间:1600 像素的图按 1568 缩只小 2%,肉眼看不出差别,却要重新编码一次,而重编码既可能掉画质、也可能让文件变大,缩了没收益就不缩。重采样用 HighQualityBicubic,并同时打开 PixelOffsetMode.HighQuality(消除半像素偏移导致的整体发虚)与 ImageAttributes.SetWrapMode(TileFlipXY)(否则缩放时边缘会取到「图外」像素,得到一圈半透明脏边)。
- EXIF 方向:先摆正再算尺寸:手机竖拍的照片,像素往往是横着存的,靠 EXIF 的 Orientation 标记(0x0112)告诉看图软件「请转 90°」。不处理的话,AI 看到的就是一张躺着的人像。本工具读到 1-8 的标记后映射到 RotateFlipType 做原地旋转/镜像,并且一定要在缩放之前完成——顺序反了会按错误的画幅算目标尺寸,横竖两个上限全乱。注意 5 与 7 是「先旋转再翻转」,必须写成 Rotate90FlipX / Rotate270FlipX。
- 透明通道:转 JPEG 前合成白底,压完更大就原样保留:JPEG 没有 alpha 通道,带透明的 PNG 直接存成 JPEG,透明区域会变成黑色或出现绿边——编码器拿到的 alpha 被直接丢弃了。所以走 JPEG 分支前先按 SourceOver 合成到不透明白底。反过来还有一种情况:一张 78 KB 的透明 LOGO 重编码成 PNG 会变成 114 KB,这不是图被压坏了,而是 GDI+ 的 PNG 编码器本来就不如原图的生产工具。遇到「格式与源相同 + 没缩尺寸 + 没转方向 + 结果反而更大」,工具直接把原文件字节复制过去,标「原样保留(已合规)」,用户不会遇到「用了压缩工具结果更大了」。
- 后台线程 + BeginInvoke:窗口不假死,结果不错位:批量处理起一个后台线程跑,线程里只做纯计算与文件写入;要更新界面时把委托丢回 UI 线程(BeginInvoke),自己不碰任何控件。这样进度条能走、状态文字逐张刷新,点「停止」也只是置一个 volatile 标志,当前这张做完就收工。文件列表在开跑前就按输入顺序插好占位行,完成后按下标原地更新,所以结果永远与输入顺序一致,不会因为完成快慢而错位。
技术栈:C#、.NET 4.8、WinForms 窗体、System.Drawing 图像处理、纯本地离线运行
已知局限:只处理常见位图格式(JPG / PNG / BMP / GIF / TIFF)。WebP 与 HEIC 不支持——GDI+ 在 Windows 上默认没有这两个解码器,工具宁可不列,也不承诺做不到的事。GIF 只取第一帧,动图会变成静帧。输出为 JPEG 时不保留 EXIF(方向已经烘进像素,拍摄参数、机型、GPS 都会丢掉,这一点对隐私反而是好事)。PNG 是无损格式、没有质量旋钮,所以「体积上限」对 PNG 不生效,只能通过限制尺寸减体积。长边只超出上限 5% 以内时不做缩放(缩了没收益)。单张图极大(超过一亿像素)时会被跳过并提示。
同类软件对照
下面几款都是公开可查的同类软件,定位各不相同。这里只说明各自的定位,以及本工具在其中的位置,方便你判断哪一类更契合自己的用法。
| 软件 | 它的定位 | 本工具的定位 |
|---|---|---|
| Squoosh(Google 开源,浏览器端) | 在浏览器里对单张图片做压缩与画质对比,可切换多种编码格式并细调参数 | 本工具面向批量:一次把整个文件夹跑完,只保留「长边上限 / 体积上限」两个常用档位,不需要逐张调参数,也不用开浏览器 |
| XnConvert | 跨平台的批量图像转换工具,用「动作链」把缩放、裁剪、水印、滤镜等步骤串起来,支持格式很广 | 本工具没有动作链,只做喂图给 AI 时最常需要的那三件事(限长边、限体积、按 EXIF 摆正),所以界面上只有两组下拉框和一个开关 |
| ImageMagick | 命令行的图像处理套件,适合把批量处理写进脚本或构建流水线,能力覆盖面很广 | 本工具是窗口程序,选文件、点按钮就能拿到结果,不需要记命令与参数 |
| TinyPNG(在线压缩服务) | 在网页上传图片后返回压缩结果,主要用于 PNG 与 JPEG 的体积压缩 | 本工具全程在本机处理,图片不离开电脑;除了压体积,还会在 JPEG 与 PNG 之间挑更小的那个,并按 EXIF 把竖拍照片摆正 |
以上仅作定位对照,各软件的可用性、授权方式与功能范围请以其官方页面为准。
操作教程
- 把图片加进来
点「添加图片…」多选,或点「添加文件夹…」把整个目录连子文件夹一起收进来;也可以直接把文件或文件夹从资源管理器拖进窗口。重复的路径会自动去重,本工具自己的输出目录会被跳过。
预期结果:列表里按文件名排好序,每行显示原始尺寸与原始体积,底部显示「共 N 个文件 · 总计多少 MB」。 - 选长边上限
默认 1568 px,这是多数对话模型在内部处理图片时实际会用到的量级——再大也会被它们缩下来。要看清细节选 2048 px,只想快速过一遍内容选 1024 或 768 px。
预期结果:下拉框左边即时显示所选值,不需要点确定。 - 选体积上限
默认 4 MB。如果目标平台单张只收 2 MB 或 1 MB,这里选对应的档;选「不限制体积」就只按尺寸缩。
预期结果:输出文件不会超过这个上限;极少数情况下压不进去,状态列会写明原因。 - 输出格式保持「自动」
默认就是自动:工具会检查图片有没有真的透明,有透明存 PNG;没有透明就把 JPEG 和 PNG 各编一份,挑体积小的那个。也可以手动强制成 JPEG 或 PNG。
预期结果:列表里「处理后」那一列的扩展名会跟着变——照片出来是 .jpg,白底截图出来是 .png,这是正常的。 - 确认输出位置与方向选项
输出目录留空时,每张图会存到它自己所在目录下的 _ai_ready 子文件夹;也可以点「浏览…」指定一个统一目录。下面「按 EXIF 方向摆正竖拍照片」默认勾选,手机拍的照片会自动转正。输出的文件名统一加 _ai 后缀,例如 photo.jpg 变成 photo_ai.jpg。
预期结果:原图永远不会被覆盖;重复跑同一批文件会覆盖上一次的输出,不会堆出 _2、_3。 - 点「开始压缩」
进度条按文件数推进,状态文字显示当前正在处理哪个文件。中途想停就点「停止」,已经处理完的不会回滚。
预期结果:每一行的「处理后尺寸 / 处理后体积 / 状态」依次填上真实结果,完成的行变绿;「原样保留」的行显示为灰色。 - 看结果并打开目录
底部一行汇总「成功 N 个 · 原体积 → 新体积(省百分之多少)」。点「打开输出目录」直接在资源管理器里定位到输出文件夹。
预期结果:输出目录里是与列表一一对应的 _ai 文件,可以直接拖进 AI 对话框。
常见问题
技术实现与后续维护
整个程序分四层:纯计算层(PreprocessCore)只做数学与字符串,图像层(ImageIo)只做解码编码与重采样,流水线层(Preprocessor)按固定顺序串起来,界面层(MainForm)只管收集参数与展示。四层之间没有反向依赖,所以任何一层都能单独测试——内建自测里的 A 到 G 组完全不碰文件系统,H、J 组才会真的写盘。后续维护最需要盯的是两类东西:一是 GDI+ 的行为差异(不同 Windows 版本的 JPEG 编码器输出的字节数会略差,所以自测断言用「不超过上限」而不是「等于某个数」);二是 EXIF 方向的映射表,改动前务必用带标记点的图跑一遍 B2 组,只看映射表是看不出方向反了的。
运行环境:
Windows 7 SP1 / 8.1 / 10 / 11(64 位);需要 .NET Framework 4.8,Windows 10 1803 及以后为系统自带,无需另行安装。程序为单个可执行文件,解压后双击即可运行,不写注册表、不装服务、不需要联网授权。
可扩展方向:
- 加「按用途预设」:比如「喂给对话模型」「做训练素材」「发公众号」,每个预设带一组尺寸与体积,省掉用户对着下拉框犹豫
- 加「保持目录结构」:处理整个项目文件夹时按原相对路径输出,便于批处理后仍能一一对应
- 加「体积更精确的模式」:对 JPEG 采用多轮微小质量步进(而非纯二分),把结果再逼近上限一点,代价是编码次数变多
- 加「批量重命名」:输出名里带尺寸与体积,例如 photo_1200x900_182KB.jpg,方便事后按规格挑图
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:把图片喂给 AI 时,原图动辄十几 MB、长边四五千像素,上传被拒或超出接口限制;用在线压缩站又要先把图传到别人服务器,截图和未发布的图不方便外传。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 按某个平台的附件限制做定制(比如单张 1.5 MB、长边 1280),并把参数固定在程序里不给用户改
- 增加 WebP/HEIC 支持(需要引入对应解码库,体积会变大)
- 处理完成后自动打包成一个 zip,方便一次性上传
- 把处理流程做成可被已有脚本调用的接口,纳入自动化流水线
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具在本地运行,不联网、不上传任何数据到服务器。
- 涉及文件改写的功能,请在使用前备份原始文件。
- 软件完全免费,可自由使用与转发,请勿用于倒卖。
- 因误操作造成的数据问题请自行承担。

