:root {
--primary: #06b6d4;
--primary-dark: #0891b2;
--secondary: #22d3ee;
--bg-dark: #ffffff;
--bg-card: #f8fafc;
--bg-code: #1e293b;
--text-primary: #1e293b;
--text-secondary: #64748b;
--border: #e2e8f0;
--success: #16a34a;
--warning: #d97706;
--danger: #dc2626;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', 'Segoe UI', 'Hiragino Sans GB', sans-serif;
background: var(--bg-dark);
color: var(--text-primary);
line-height: 1.8;
min-height: 100vh;
}
.container { max-width: 900px; margin: 0 auto; padding: 40px 24px; }
header {
text-align: center;
padding: 60px 0;
background: linear-gradient(135deg, rgba(6,182,212,0.08) 0%, rgba(34,211,238,0.08) 100%);
border-bottom: 1px solid var(--border);
margin-bottom: 48px;
}
.logo { font-size: 64px; margin-bottom: 16px; }
h1 {
font-size: 2.5rem; font-weight: 700;
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text; margin-bottom: 12px;
}
.subtitle { color: var(--text-secondary); font-size: 1.1rem; }
.badge {
display: inline-block;
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
color: white; padding: 4px 12px; border-radius: 20px;
font-size: 0.85rem; font-weight: 500; margin-top: 16px;
}
section {
background: var(--bg-card); border-radius: 16px;
padding: 32px; margin-bottom: 24px; border: 1px solid var(--border);
}
h2 {
font-size: 1.5rem; font-weight: 600; margin-bottom: 24px;
display: flex; align-items: center; gap: 12px;
}
h2 .icon { font-size: 1.6rem; }
h3 { font-size: 1.15rem; font-weight: 600; margin: 20px 0 12px; color: var(--primary-dark); }
p { margin-bottom: 16px; }
ul, ol { margin-bottom: 16px; padding-left: 24px; }
li { margin-bottom: 8px; }
.feature-grid {
display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 16px; margin: 20px 0;
}
.feature-card {
background: white; border: 1px solid var(--border); border-radius: 12px;
padding: 20px; text-align: center;
transition: transform 0.2s, box-shadow 0.2s;
}
.feature-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.08); }
.feature-card .icon { font-size: 2rem; margin-bottom: 8px; }
.feature-card .title { font-weight: 600; margin-bottom: 4px; }
.feature-card .desc { font-size: 0.85rem; color: var(--text-secondary); }
code {
font-family: ui-monospace, 'Cascadia Code', 'SF Mono', Consolas, 'Courier New', monospace;
background: rgba(6,182,212,0.1); color: var(--primary-dark);
padding: 2px 8px; border-radius: 4px; font-size: 0.9em;
}
.code-block {
background: var(--bg-code); border-radius: 12px; padding: 20px;
margin: 16px 0; overflow-x: auto; position: relative;
}
.code-block code { background: none; color: #e2e8f0; padding: 0; font-size: 0.9rem; line-height: 1.6; }
.code-block .lang-label {
position: absolute; top: 8px; right: 12px; font-size: 0.75rem;
color: #64748b; font-family: ui-monospace, 'Cascadia Code', 'SF Mono', Consolas, 'Courier New', monospace;
}
.step {
display: flex; gap: 16px; margin-bottom: 24px; padding: 20px;
background: white; border-radius: 12px; border: 1px solid var(--border);
}
.step-number {
flex-shrink: 0; width: 36px; height: 36px;
background: linear-gradient(135deg, var(--primary), var(--secondary));
color: white; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 0.95rem;
}
.step-content { flex: 1; }
.step-content h4 { font-weight: 600; margin-bottom: 8px; }
.alert {
padding: 16px 20px; border-radius: 10px; margin: 16px 0;
display: flex; gap: 12px; align-items: flex-start;
}
.alert-info { background: rgba(59, 130, 246, 0.08); border: 1px solid rgba(59, 130, 246, 0.2); }
.alert-success { background: rgba(22, 163, 74, 0.08); border: 1px solid rgba(22, 163, 74, 0.2); }
.alert-warning { background: rgba(217, 119, 6, 0.08); border: 1px solid rgba(217, 119, 6, 0.2); }
a { color: var(--primary-dark); text-decoration: underline; }
a:hover { color: var(--primary); }
a.download-btn {
display: inline-block; margin: 4px 0; padding: 8px 16px;
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
color: #fff !important; text-decoration: none !important;
border-radius: 8px; font-weight: 600;
}
a.download-btn:hover { opacity: 0.9; }
.links-fold {
margin: 16px 0 4px; border: 1px solid var(--border); border-radius: 12px;
background: white; overflow: hidden;
}
.links-fold > summary {
cursor: pointer; list-style: none; padding: 16px 20px; font-weight: 600;
color: var(--primary-dark); background: rgba(6,182,212,0.06);
display: flex; align-items: center; gap: 10px; user-select: none;
}
.links-fold > summary::-webkit-details-marker { display: none; }
.links-fold > summary::after { content: "▾"; margin-left: auto; transition: transform 0.2s; }
.links-fold[open] > summary::after { transform: rotate(180deg); }
.links-body { padding: 16px 20px; line-height: 2; border-top: 1px solid var(--border); word-break: break-all; }
table.spec { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 0.95rem; }
table.spec th, table.spec td { border: 1px solid var(--border); padding: 10px 14px; text-align: left; vertical-align: top; }
table.spec th { background: rgba(6,182,212,0.1); color: var(--primary-dark); font-weight: 600; }
table.spec td code { white-space: nowrap; }
table.spec tr:nth-child(even) td { background: #fbfdfe; }
.gallery { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; margin: 20px 0; }
.gallery figure { background: white; border: 1px solid var(--border); border-radius: 12px; overflow: hidden; margin: 0; }
.gallery img { width: 100%; height: auto; display: block; }
.gallery figcaption { padding: 10px 12px; font-size: 0.85rem; color: var(--text-secondary); text-align: center; }
.footer { text-align: center; padding: 40px 0; color: var(--text-secondary); font-size: 0.9rem; }
.footer .brand {
font-size: 1.2rem; font-weight: 700;
background: linear-gradient(135deg, var(--primary), var(--secondary));
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
}
把图片压瘦一半,画质还看不出
拖一把图片进窗口,自动组合最优压缩工具,去掉多余元数据,把体积减到最小
GPL-2.0 · 免费开源
📖 项目简介
ImageOptim 是作者 Kornel Lesiński 开发的 macOS 免费开源图片压缩应用。你把 PNG / JPEG / GIF 动画 / SVG 图片拖进它的窗口,它就自动把文件体积压到最小——官方实测平均能省 40%+,单张最高 61.2%,而画质几乎看不出区别。
核心原理:拖放后自动运行多款业界最优的压缩引擎(MozJPEG、pngquant、Pngcrush、AdvPNG、OptiPNG、PNGOUT、Google Zopfli、SVGO、7zip),逐张比较后取最小的结果;先做无损优化去掉 EXIF、GPS、相机序列号等多余元数据,可选开启有损压缩来换更小的体积。所有这些工具都是免费开源的。
版本沿革:项目在 GitHub 上已获 1.0 万 Star,最新版本 1.9.3(要求 macOS 11+,兼容 Sonoma),2026-10 仍在更新,GPL v2 或更新协议,可分享、可修改、可商用。
📎 相关链接与下载地址(点击展开)
官网:imageoptim.com/mac
下载:在 GitHub 搜索 ImageOptim,或进入官网 Download 页
更多教程:关注公众号 / 抖音 / 视频号「AI工具匠」
✨ 核心亮点
🧩 它能做什么、输出什么
| 项目 | 说明 |
|---|---|
| 输入 | PNG、JPEG、GIF 动画、SVG |
| 适用类型 | 网页配图、App 图标资源、电商/社媒图、摄影原图去隐私 |
| 输出 | 优化后的同格式图片,可覆盖原文件或另存 |
| 语言 / 兼容 | macOS 11+(Sonoma),Objective-C/JS;支持命令行、Sketch、邮件集成 |
| 规格 / 容量 | 支持多文件/整文件夹批量,命令行可处理整个目录 |
🖥️ 环境要求
| 环境 | 建议配置 |
|---|---|
| 操作系统 | macOS 11+(兼容 Sonoma);老 Mac 有 Yosemite 10.10 版 |
| 运行环境 | 独立 App,下载解压即用,无需额外安装依赖 |
| 硬件 | 普通 Mac 即可,压缩主要吃 CPU 少量时间 |
| 低配方案 | 非 Mac 可用命令行同源工具,或在线压缩服务 |
| 关键依赖 | 内置 MozJPEG / pngquant / Pngcrush / OptiPNG / PNGOUT / Zopfli / SVGO / 7zip |
🖼️ 效果图与演示
拖放压缩的实际效果:下方两张图显示 icon.png 省 61.2%、picture.jpg 省 22.6%,平均每文件省 41.9%。


🚀 如何使用
下载并安装
到官网或 GitHub Releases 下载 .tbz2 压缩包,解压后把 ImageOptim.app 拖进「应用程序」文件夹。
# 打开下载的 .tbz2,把 ImageOptim.app 拖进 应用程序 文件夹即可拖放压缩
把图片或整个文件夹拖进窗口,自动逐张优化;每张显示节省比例(Savings),底部看总数和平均。也可拖到 Dock 图标、Finder 的服务菜单或邮件附件上。
# 图形操作:直接把图片/文件夹拖进 ImageOptim 窗口命令行批量处理
用 open -a 处理当前目录,或用 imageoptim 命令行工具指定文件/目录,适合写进脚本流水线。
# 优化当前目录所有图片
open -a ImageOptim .
# 命令行指定文件/文件夹
imageoptim photo.jpg banner.png ./assets
想更小?开有损压缩
默认精确保画质。若允许轻微牺牲画质换取更小体积,到 Preferences 开启 Lossy minification,对 JPEG/SVG/GIF/PNG 都适用。
# ImageOptim > Preferences > Lossy minification 勾选开启
🎯 典型应用场景
📈 与同类做法对比
| 做法 | 结果 |
|---|---|
| 在线压缩站(TinyPNG 等) | 方便但要上传第三方、有配额限制,常有水印/广告,大文件受限 |
| 单独用 pngquant / MozJPEG | 命令行、要自己拼参数,只管单一格式,压缩引擎要逐个装 |
| ImageOptim | 本地一键、组合多引擎取最小、支持全格式,免费开源、不上传 |
❓ 常见问题
Q: 完全免费吗?
是的,GPL v2 或更新协议,免费开源,可分享、可修改、可商用(但不能剥夺别人的自由)。可选捐赠支持作者。
Q: 支持哪些格式?
PNG、JPEG、GIF 动画、SVG,可一次处理整文件夹多张图片。
Q: 会破坏画质吗?
默认精确保画质(无损),只去掉多余元数据;要更小体积可手动开启有损压缩。
Q: 压完能省多少?
官方实测平均省 40%+,单张最高 61.2%;配合 pngquant 的有损模式 PNG 甚至可减 70%。
Q: 能处理整个文件夹吗?
能。拖文件夹进窗口,或用命令行 open -a ImageOptim . 处理当前目录。
Q: PNG 太慢怎么办?
到 Preferences 取消勾选 PNGOUT 和 Zopfli,优化会快很多,只是体积略大一点。
Q: 能保留版权/相机信息吗?
可以。在 Preferences 取消勾选「Strip JPEG metadata」,就不会删除版权和拍摄信息。
Q: 为什么不在 App Store?
Apple 不允许这种自由开源许可(要求用户接受 DRM 和 EULA 限制)。官网下载是 DRM-free,随意分享。
Q: 非 Mac 能用吗?
App 只支持 macOS。Windows/Linux 可用同源的命令行工具(MozJPEG/pngquant/oxipng 等)或在线服务。
<!-- -->
<!-- -->