虎绿林支持HEIC/HEIF/AVIF图片了,但是第一次加载较慢

回复列表(117|隐藏机器人聊天)
  • @Ta / 2022-01-15 / /

    @Curtion,我添加了缓存,现在的体验已经变得可用了。

  • @Ta / 2022-01-15 / /

    @Curtion@saschazar/wasm-heif在浏览器里不正常,用官方示例代码解码根本没反应,也没有任何错误。

    https://hu60.cn/js/node_modules/@saschazar/wasm-heif/index.html

    图片.png

  • @Ta / 2022-01-15 / /

    @Curtion找到了另一个有希望的解码包。并不是,只是图片类型检测。
    https://github.com/sapphi-red/node-midec

    Multi-image detector (Wasm). cf. Animated GIF, APNG, Animated WebP, Animated HEIF/AVIF.
    
    Pure Webassembly + JavaScript port of midec.
    
    Pure go multi-image detector. cf. Animated GIF, APNG, Animated WebP, Animated HEIF / AVIF.
    

    看起来是从golang编译的,内存安全性应该更好。

  • @Ta / 2022-01-15 / /

    @Curtion,呃看错了,它只是图片类型检测,并不是解码……

  • @Ta / 2022-01-15 / /

    甚至有人用wasm播放h.265视频
    https://zhuanlan.zhihu.com/p/73772711

  • @Ta / 2022-01-15 / /

    @Curtion,我终于知道了,原来npm上的例子是错的,不能在初始化函数里调用decode,会死锁。必须在外面调用才行。

    https://github.com/saschazar21/webassembly/pull/547

    图片.png

  • @Ta / 2022-01-15 / /

    好像各大浏览器都不打算支持 HEIC 格式了

  • @Ta / 2022-01-15 / /

    c1ab786c0ce3d10fbb4f16d1e303ecce4409207.heic

  • @Ta / 2022-01-15 / /

    @Curtion,大无语事件,好不容易做好了wasm版,结果它却把3楼的图片解码成这样。横向都没问题,纵向似乎就不行了……
    只能回滚到纯js版本……

    问题展示:https://heic-test.hu60.cn/

    index.jpg

  • @Ta / 2022-01-15 / /

    @无名啊,谷歌想推自己的AV1/AVIF,火狐不想牵涉专利问题,所以都不会支持。但是图片解码看起来还是不难,网站也能靠自己实现支持。

  • @Ta / 2022-01-15 / /

    @老虎会游泳,相同质量下,webp 和 heif 差得多吗?webp 省流效果好像也可以?

    有个疑问,如果用户上传原图,网站显示时默认显示压缩过的 webp/heif/jpg 等,用户体验/省流效果好像没啥问题?

    老虎出于啥考虑没这么干呢?

  • @Ta / 2022-01-15 / /

    @无名啊,我不想在浏览器之外进行图片处理,因为要么是收费的(OSS按次计费),要么很慢(服务器带宽5Mbps)。

  • @Ta / 2022-01-15 / /

    @老虎会游泳,“添加附件”里的“图片压缩”,也是前端完成的?

    用 wasm 实现 cwebp 或者 heif-enc 的难度大吗

  • @Ta / 2022-01-15 / /

    @老虎会游泳,感觉网站用户上传图片不是很频繁。如果能闲时压缩,效果应该不错。

    Linux 的网络资源有没有优先级之分的?要是有,来个最低级别下载原图再压缩传回。也不影响正常用户访问

    或者,凌晨时再压缩?

  • @Ta / 2022-01-15 / /

    @无名啊,“添加附件”里的“图片压缩”,也是前端完成。
    前端编码webp没有问题。但是如果用户不自己选压缩,我肯定不会对其图片进行处理。我喜欢原图。

  • @Ta / 2022-01-15 / /

    @无名啊,所以我一早就说过,我能接受的唯一方案是前端解码。因为我喜欢原图,在存储之前,我不想看到任何形式的转换。既然要存储原图,那我肯定也不想再存储缩略图。

    至于附件上传的压缩功能,那是他自己想压的,那就如他所愿。

  • @Ta / 2022-01-15 / /

    @老虎会游泳,我通过canvas直接对原始RGB绘制,可以正常的显示出二楼的图片,同时测试了iPhone上的heic依然可以正常显示。

    我的代码如下

    
        const alpha = true;
        let result = heifModule.decode(buffer, buffer.length, alpha);
        heifModule.free();
        let ctx = document.getElementById("canvas").getContext("2d");
        console.log(result.length, 2708 * 6016 * 4);
        let imgData = new ImageData(Uint8ClampedArray.from(result), 2708, 6016);
        ctx.putImageData(imgData, 0, 0);
    

    其中2708、6016为图片的宽和高

    如果把alpha设置为false的话那么图片高x宽x3却不等于result.length。
    如果把alpha设置为true的话,透明信息都被设置成了255,但高x宽x4正好和result.length相同。

    虽然我对图像编码不了解,但是我认为alpha设置为false时应该是不正常的,它的大小居然会比去除透明通道后的图片还要大,多出来的一些数据可能影响了jpeg编码库。
    红米K30 Pro(变焦版)

  • @Ta / 2022-01-15 / /

    @Curtion,我试试透明通道true。因为开发者在demo里写“不知道什么原因透明通道不能正常工作”,所以我才保持默认值false的,并且没有试过true

  • @Ta / 2022-01-15 / /

    @Curtion,开了透明通道果然好了。

  • @Ta / 2022-01-16 / /

    @Curtion,然后发现mozjpeg才是导致UC浏览器中转换失败的原因。改为canvas转换就好多了。

添加新回复
回复需要登录