发布于 2026-05-23
限制背景
小程序对图片体积有硬性限制:
- 单张图 ≤ 500KB:超过会被后台拒绝上传
- 整包 ≤ 2MB(主包):所有图标 + 启动图 + JS / WXSS 加一起
- 分包 ≤ 2MB:可以加 9 个分包,但每个分包独立限制 2MB
设计师交付的常常是 PSD 导出的 JPEG / PNG,3-5MB 是常态。直接传后台就挂。
不同图片类型,优化策略不同
1. tabBar / 顶部 nav 图标(40KB 上限)
小程序 tabBar 官方要求图标 ≤ 40KB,推荐尺寸 81×81。
| 步骤 | 操作 |
|---|---|
| 1. 设计稿出图 | 162×162 @2x(为高分屏准备) |
| 2. 改尺寸 | 用 图片改尺寸 缩到 81×81 |
| 3. 转 PNG-8 | 如果是单色图标,转 PNG-8 调色板版,通常 < 5KB |
| 4. 兜底压缩 | 图片压缩 PNG 模式,无损 |
实战:81×81 单色 PNG-8 ≈ 2-4 KB,远低于 40KB 限制。
2. 列表缩略图(100-200KB)
商品列表 / 文章列表的卡片缩略图,建议:
- 尺寸:实际显示宽度 × 2(适配高分屏),例如显示 200rpx 宽 = 200px,出图 400×400
- 格式:JPEG 优先(列表图大多是照片或带丰富色彩)
- 质量:75-82
- 目标:100-200 KB / 张
操作:
- 设计稿原始 400×400 给到
- 图片压缩 → 目标大小 150 KB
- 输出 JPEG,quality 75-82(工具自动算)
3. 详情大图(300-500KB)
商品详情主图、文章顶部 banner:
- 尺寸:实际显示宽度 × 2,典型 750×500 或 1080×608
- 格式:JPEG / WebP(WebP 体积小但兼容性看小程序版本)
- 质量:80-85
- 目标:300-500 KB / 张
如果原图 3MB,压到 400KB 完全没问题,肉眼看不出差异。
4. 启动图 / 开屏图(150-300KB)
启动图是小程序加载前显示的图,加载快慢直接影响第一印象。
- 强烈建议 ≤ 200KB,大了启动卡顿
- 750×1334(iPhone 6/7/8 等基准尺寸)
- JPEG quality 80
三种压缩方案对比
A. 浏览器在线压(推荐个人 / 中小项目)
直接用 趁手 iKit 图片压缩:
✅ 优点:免费,无需安装,文件不上传服务器(隐私安全) ✅ 批量上传一起处理 ❌ 缺点:超大文件(>100MB)浏览器吃不消,但小程序图都很小,实际不构成问题
B. 命令行 ImageMagick / cwebp(开发者大批量)
# 批量 JPEG 压缩
mogrify -quality 80 -resize 1080x *.jpg
# 批量转 WebP
for f in *.jpg; do
cwebp -q 80 "$f" -o "${f%.*}.webp"
done
✅ 优点:几百张图秒级处理 ❌ 缺点:要会命令行,配置 ImageMagick 麻烦
C. 桌面软件(Photoshop / TinyPNG 客户端)
✅ PS:细节调整最强,设计师习惯 ❌ 慢,要逐张操作
一份微信小程序图片资源清单
按上面策略,一份典型电商小程序需要的图大致:
| 类型 | 数量 | 总体积上限 | 建议参数 |
|---|---|---|---|
| tabBar 图标 | 5×2(普通+选中) | 50KB | 81×81 PNG-8 |
| 顶部 nav 图标 | 10 个 | 100KB | 48×48 PNG-8 |
| 首页 banner | 3-5 张 | 1.5MB | 1080×432 JPEG q82 |
| 商品列表缩略图 | 20 张(主包内) | 3MB(动态加载,不入主包) | 400×400 JPEG q78 |
| 详情大图 | 动态加载,不入包 | - | 1080×1080 JPEG q80 |
| 启动图 | 1 张 | 200KB | 750×1334 JPEG q80 |
主包优先把图标和 banner 控制到 ≤ 1.5MB,留 500KB 给 JS / WXSS,差不多就贴着 2MB 上限。
常见问题
Q:用 WebP 行吗?
A:微信小程序基础库 2.9.0+ 支持 WebP(2020 年起),大部分用户没问题。但强烈建议同时准备 JPEG fallback,通过 wx.getSystemInfoSync() 判断系统版本,老版本走 JPEG。
Q:为什么我的 PNG 怎么压都 ≥ 200KB?
A:PNG 是无损压缩,对照片几乎不会变小。PNG 适合 logo / 图标 / 带透明背景的图。照片用 JPEG,体积能小 10 倍。
Q:可以用 base64 内联避免请求吗?
A:小图标 (< 5KB) 可以,但会让 WXSS 文件膨胀,反而占主包体积。小程序自带图片缓存(用户访问过的图下次直接读本地),inline base64 反而失去这个优化。
Q:动图(GIF)怎么办?
A:GIF 通常都很大,强烈不建议放主包。改用:
- 用 视频转 GIF 先压一遍(降帧率到 15 fps、宽度 480px)
- 或者上传到 CDN 走 URL 引用
- 或者改用静态图 + 文字描述
总结
小程序图片优化的核心是:对的尺寸 + 对的格式 + 对的质量参数。三步走: