新闻详情

新闻详情

首页 / 资讯中心 / 详情

Chrome读不了HEIC怎么办:原生解码和WASM两条路

发布时间:2026/9/29 20:34:19来源:尧图网络
Chrome读不了HEIC怎么办:原生解码和WASM两条路
公司上个月办了个读者投稿活动。收上来的照片有一小半是.heic审核后台在 Chrome 里一张都预览不出来。同事问我能不能在网页里直接转 JPG。我先得搞清楚两件事浏览器自己能读到什么程度读不了的时候塞一个 WASM 解码器进去又要付出多少测试用的是 Playwright 1.61.1 自带的三个内核构建。全部 headless机器是 Apple M4 / 16 GB。样本是我用 sips 从合成图编出来的 HEIC分 3MP、12MP 和 48MP 三档。它们不是 iPhone 拍的原片。成品对照我用的是图映 ImgInghttps://imging.cn/的压缩转换样本和机器都跟前面一样。浏览器能直接打开 HEIC 吗只有一家能。Chromium 149 和 Firefox 151 构建上四条原生路全部走不通。img直接走进 onerror。img.decode()报的是EncodingError。createImageBitmap则报InvalidStateError。本地起的 Python 静态服务把 .heic 当成application/octet-stream发出去我一开始怀疑是 MIME 不对。于是把 Blob 的 type 改成image/heic再喂一遍照样失败。WebCodecs 这条路我也试了两家的isTypeSupported(image/heic)都是 false。换成image/avif倒是 true。WebKit 26.5 构建则是全部成功。方向 6 和方向 8 的竖拍样本出来都是正的也没有转两次。它能读是因为调用了 macOS 的系统解码器。我测的只是 Mac 上的这个构建Safari 正式版和 iOS 上会不会一样我没有环境验证。原生解码 HEIC 省在哪、差在哪原生这条路最省的是下载量。图映在 WebKit 构建上直接显示「浏览器可读」整个过程没有下载任何 HEIC 解码文件。上传到可读的时间 12MP 是 176 ms、48MP 是 439 ms。它的短板也很直接能不能用全看用户用的是哪个内核开发者一点都插不上手。WebKit 这个构建还没有ImageDecoder只能走img或createImageBitmap拿浏览器处理好的位图。WASM 解码 HEIC 要下载多少图映在 Chromium 和 Firefox 构建上先用img试一下原生。失败了才在界面上放一个「加载解码器」按钮不点就什么都不下。点下去以后只多了两个请求。大头是libheif-bundle.mjs解压后 1,461,926 字节gzip 传输 520,705 字节。WASM 是用 base64 塞在这个 .mjs 里的。解出来有 1,034,305 字节二进制里能看到 libheif 1.19.8 和 libde265 的字样。我第一轮在 Network 面板里找.wasm请求一条都没找到差点以为它根本没用 WASM。后来翻了文件内容才发现是内联的。再次打开页面也便宜它把用过的解码器记在 localStorage 里。刷新后自动发两个条件请求两个都回 304 共 1,095 字节。之后再传 HEIC 就不出按钮了。WASM 这条路多出来的活能读只是开始。Chromium 149 上 12MP 解码 377 ms48MP 要 1.56 s。编译和解码都在主线程上同步跑。我挂的探针只记到new WebAssembly.Module和new WebAssembly.Instance各一次。没见到 Worker。解码期间最长的长任务 12MP 是 393 ms、48MP 是 1.60 s。长任务的长度基本就是整段解码的时长。方向要自己心里有数sips 编出来的文件同时带着irot270° 和 EXIF 方向 6。libheif 只认前者。图映导出时再把 Orientation 改成 1我数了 25 个产物全是正的。颜色是另一个坑libheif 吐出来的是没做色彩管理的 P3 数值。在 Chromium 和 Firefox 构建上图映把源文件的 ICC 原样写回。12 个色块的 ΔE2000 都在 0.31 以内。同一批像素要是丢了 ICC 按 sRGB 看域内颜色就偏到 2.36–3.33。审核后台最后怎么接我给同事的方案是两段。先用createImageBitmap试原生成功就直接预览。失败再按需加载 WASM 解码器导出时把 ICC 带上。48MP 那档在 M4 上都要卡一秒半我在按钮旁边先加了一行「大图解码中」的提示。还有一块我心里没底投稿里真正的 iPhone 原片可能带 HDR 增益图或 10 bit。这组合成样本一张都没覆盖。等拿到几张真原片我再跑一遍。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【Python 学习第 20 天】类型转换 2026/9/29 21:16:07

【Python 学习第 20 天】类型转换

【Python 学习第 20 天】类型转换学习日期:2026-09-28 知识点:类型转换 难度:0.65一、今日知识点 今天学习的是 类型转换。 类型转换是把一种数据类型变成另一种数据类型。Python 中分为隐式转换(自动进行,如 int 和 f…

阅读更多 →
Arduino CH552编译报错sdcc.sh syntax error?Shell解释器bash与dash差异排查 2026/9/29 21:16:07

Arduino CH552编译报错sdcc.sh syntax error?Shell解释器bash与dash差异排查

本来这次编译应该是三分钟以内的事:Arduino IDE 里选好 CH552 开发板,写一个经典的 Blink,然后点上传。结果编译进度条走到一半,输出区弹出一行孤零零的提示:sdcc.sh: syntax error: unexpected "("没有指向…

阅读更多 →
ASM入网小助手卸载成功:TaoToken 统一 Key 通道配置与验证实录 2026/9/29 21:16:07

ASM入网小助手卸载成功:TaoToken 统一 Key 通道配置与验证实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从Claude Code泄露源码看工程架构:TaoToken 统一 Key 通道下的 MCP 配置骨架与验证 2026/9/29 21:16:07

从Claude Code泄露源码看工程架构:TaoToken 统一 Key 通道下的 MCP 配置骨架与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PLC信号抖动怎么解决?消抖功能块ST代码与工程经验详解 2026/9/29 21:16:07

PLC信号抖动怎么解决?消抖功能块ST代码与工程经验详解

做现场调试这些年,我最怕的不是复杂的轴联动,也不是PID参数乱飞,而是那种“看起来很简单”的信号问题。按钮按下去,指示灯偶尔不亮;接近开关碰到工件,有时候响应、有时候不响应;光电传感器对着运…

阅读更多 →
vscode 使用 pencil 搭配 claude code:MCP 配置文件与验证骨架 2026/9/29 21:16:00

vscode 使用 pencil 搭配 claude code:MCP 配置文件与验证骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉