小程序图片不显示主因是体积超5MB或webp格式后端不兼容;uni.compressImage在微信小程序中不存在,需用canvas或jpeg-js压缩;canvas压缩需按原图体积动态设质量参数并防iOS静默失败。

小程序图片过大不显示,本质是体积超限或格式不兼容
微信小程序对单张图片上传有明确限制:临时路径图片体积不能超过 5MB,且部分安卓机返回 webp 格式,但后端若只认 jpg 或 png,就会出现“图片选了却传不上、预览空白、控制台无报错”等现象。这不是 uni-app 的 bug,而是平台策略和后端校验共同导致的——你看到的“不显示”,往往是服务端拒收后前端没做 fallback 渲染所致。
uni.compressImage 在小程序端根本不存在
很多开发者在微信小程序里调用 uni.compressImage,结果控制台直接报 undefined is not a function。这是因为 uni-app 对微信小程序的封装中,压根没透出这个 API;它底层依赖的是微信自己的 wx.compressImage,而该接口从 2024 年起已被微信官方标记为「即将废弃」,且不支持质量参数控制。所以:
• 不要写 uni.compressImage,写了也白写
• 别信文档里“跨端统一”的说法,小程序端必须自己处理压缩
• 真要用压缩,得走 canvas + toDataURL 路线,或者引入轻量库如 jpeg-js(注意体积别超 100KB)
H5 和小程序共用 canvas 压缩时,质量参数不能写死
canvas.toDataURL("image/jpeg", 0.8) 这个 0.8 是质量系数,仅对 JPEG 生效;PNG 完全忽略第二个参数,强制转 JPEG 会丢透明通道。更关键的是:大图(比如原图 4MB)用 0.8 可能还超 5MB,小图(200KB)用 0.6 反而画质发灰。实操建议:
• 先用 uni.getImageInfo 拿到 size 字段,判断原始体积
• 体积 > 2MB → 质量设为 0.6,目标宽设为 1200
• 500KB ~ 2MB → 质量 0.75,目标宽 1080
• • 微信小程序里 canvas 绘制后,必须用 canvas.toTempFilePath(而非 toDataURL)生成临时路径,否则 uni.uploadFile 会报错
上传前必须校验压缩结果,而不是只看“成功回调”
常见错误是:canvas 压缩函数执行完就立刻调 uni.uploadFile,结果上传失败,服务端返回 “invalid image format” 或 “file too large”。真正该做的检查项:
• 压缩后文件体积是否仍 > 5MB(用 uni.getFileInfo 查)
• 临时路径是否以 http:// 或 data: 开头(若是,说明你误传了 base64 或 blob url,filePath 必须是本地临时路径)
• 图片格式是否被意外转成 webp(安卓真机常见,可用 uni.getImageInfo 的 path 字段后缀判断)
• 若后端要求 Content-Type: image/jpeg,但你传的是 PNG,需手动在 header 里覆盖,不能依赖自动识别
最易被忽略的一点:canvas 压缩在 iOS 真机上可能因内存不足静默失败,不抛错也不回调 success。务必给 canvas.drawImage 加超时兜底,比如 3s 后若没触发 success,则降级为原图上传并打日志。


















