标题: 虎绿林支持HEIC/HEIF/AVIF图片了,但是第一次加载较慢
时间: 2022-01-14发布,2022-01-24修改
HEIC/HEIF演示图片:
https://hu60.cn/q.php/bbs.topic.102432.html?floor=41#41
https://hu60.cn/q.php/bbs.topic.99791.html
https://hu60.cn/q.php/bbs.topic.102386.html?floor=1#1
AVIF演示图片(新版Firefox和Chrome原生支持AVIF,所以可以瞬间显示。请用旧版浏览器或者手机UC浏览器等进行测试):
https://hu60.cn/q.php/bbs.topic.102432.6.html?floor=118#118
解码实现:https://gitee.com/hu60t/heif-web-display
调试页面:https://hu60.cn/tpl/jhin/js/heif-web-display/
可在用户中心清除HEIF图片缓存。
首次发布:有HEIC/HEIF图片的网页目前会明显卡顿。我考虑把解码改成 web worker 后台进程以避免卡顿。
更新1:已经启用了 web worker 在后台转换,倒是不卡了,但依然不快。UC浏览器的标签页偶尔还会在同时解码多个图片时崩溃。
更新2:已经启用了缓存,所以只有第一次加载特别慢了。只要成功加载过一次,以后都是秒出现。
更新3:改用wasm版heif库进行转换,提高了首次加载速度;转换为jpg,减小内存占用。
更新4:更新3导致3楼的图像解码成这样了(问题展示),所以只能退回更慢但更正确的更新2。
更新5:修复了更新3因为透明通道导致图片扭曲变形的问题。再次使用wasm版heif库+jpg进行转换显示。第一次加载依然不是特别快,而且在UC浏览器里的稳定性好像变差了,很多图片转不出来。
更新6:找到导致UC浏览器里稳定性变差的原因了,是用mozjpeg把RGBA数据转换为jpeg时导致的崩溃。现已更换为通过浏览器自带的canvas转换,转换速度提高了很多,内存和CPU占用也有所降低。
更新7:用canvas转换为png对手机内存的压力还是有点大,UC在加载三张图片时页面经常崩溃。最后改成转换为jpeg,崩溃现象就很少了。不过UC还是偶尔转换不成功,需要刷新。
更新8:为图片解析添加了状态文字显示,解析失败时也会提示刷新。
更新9:为不支持AVIF图片的浏览器(比如手机UC浏览器)添加了AVIF解码支持。
最新效果展示,如果你反复刷新也没有这个状态文字显示,请清除浏览器缓存。
『回复列表(117|隐藏机器人聊天)』
找了一下上游实现,最终追溯到这里
https://github.com/catdad-experiments/libheif-emscripten
所以最终实现代码来自此仓库:
https://github.com/strukturag/libheif
它是一个C/C++项目,上述JS是通过Emscripten编译而来,所以理论上可以生成wasm代码,也有相关issues在讨论。
于是我查了一下npm,目前有一个现成的库:
https://www.npmjs.com/package/@saschazar/wasm-heif
从此库的描述来看,应该是支持浏览器的。
所以可以试试wasm,它应该会比js快很多。
红米K30 Pro(变焦版)