1.0万 Star:macOS 拖一拖,图片体积减半画质不变——ImageOptim 完整教程

29次阅读
没有评论

ImageOptim 使用教程 | AI工具匠

: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 或更新协议,可分享、可修改、可商用。

✨ 核心亮点

🖱️
拖放即压
图片拖进窗口就自动优化,也能拖到 Dock、邮件、Markup
🔒
无损去元数据
清掉 EXIF/GPS/相机序列号等隐私信息,也可选择保留
⚖️
画质不变体积减半
默认精确保画质只去冗余,平均省 40%+,可开有损更狠
🧩
组合最优工具
MozJPEG/pngquant/Zopfli/SVGO 全免费开源,取最小结果

🧩 它能做什么、输出什么

项目 说明
输入 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%。

🚀 如何使用

💡

核心就一句话:把图片拖进 ImageOptim 窗口,剩下的它自动干完。
1

下载并安装

到官网或 GitHub Releases 下载 .tbz2 压缩包,解压后把 ImageOptim.app 拖进「应用程序」文件夹。

bash# 打开下载的 .tbz2,把 ImageOptim.app 拖进 应用程序 文件夹即可

2

拖放压缩

把图片或整个文件夹拖进窗口,自动逐张优化;每张显示节省比例(Savings),底部看总数和平均。也可拖到 Dock 图标、Finder 的服务菜单或邮件附件上。

bash# 图形操作:直接把图片/文件夹拖进 ImageOptim 窗口

3

命令行批量处理

用 open -a 处理当前目录,或用 imageoptim 命令行工具指定文件/目录,适合写进脚本流水线。

bash# 优化当前目录所有图片
open -a ImageOptim .

# 命令行指定文件/文件夹
imageoptim photo.jpg banner.png ./assets

4

想更小?开有损压缩

默认精确保画质。若允许轻微牺牲画质换取更小体积,到 Preferences 开启 Lossy minification,对 JPEG/SVG/GIF/PNG 都适用。

bash# ImageOptim > Preferences > Lossy minification 勾选开启

🎯 典型应用场景

🌐
网页配图
发公众号/网站前批量压图,页面加载更快
🛒
电商/社媒图
商品图、小红书/抖音配图压瘦不发糊
📱
App 图标资源
压小图片让 Mac/iOS App 安装包更小
📍
摄影原图去隐私
发布前清掉 EXIF/GPS 定位和相机序列号
🗂️
素材存档
整理图片库,省硬盘空间和备份体积
🤖
自动化批量
配合命令行/Sketch 插件做发布流水线

📈 与同类做法对比

做法 结果
在线压缩站(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 等)或在线服务。


<!-- -->
<!-- -->

正文完
 0
评论(没有评论)