【发布时间】:2015-02-19 13:48:11
【问题描述】:
最近有一些关于 Fabrice Bellard 的 BPG 图像格式 (http://bellard.org/bpg/) 的讨论,该格式(基于他网站上提供的演示)提供比 jpeg、webp 和其他一些更好的压缩。图像解码是在浏览器中用JS完成的,这意味着它可以立即使用,无需等待浏览器采用。总体而言,这似乎是一个好主意,用一些 CPU 时间换取更快的下载速度通常是一个可行的折衷方案。
used here 换出图像的技术是在 window.load 上迭代 document.images,找到 src 属性包含以“.bpg”结尾的 URL 的任何位置,并将其替换为画布。
然而,这绝对不是解决问题的唯一方法,我看到了这种技术的一些缺点,其中包括:a) 画布与图像没有完全相同的布局规则 - 例如在其上设置宽度属性意味着在 img 与画布上有所不同,b) 似乎至少在 Chrome 中,对于缩小的图像与画布的缩放方式是不同的。
一个更好的解决方案最好能满足这些要求:
- 尽量不要在内存中复制不必要的图像数据(也不要不必要地使用比必要更多的 CPU - 与原生图像处理相比,在 JS 中解码已经需要很多)
- 尽可能多地兼容浏览器
- 使用
标签而不是
- 提供一种简单的方法,不仅可以处理加载文档时的图像,还可以处理稍后添加到文档中的图像(例如响应用户活动)
- 仍然易于使用(bellard.org 上的现有技术当然很容易集成)
- 编辑:使用网络工作者在不阻塞页面的情况下解码图像也是一个不错的方法。
想到的一些相关工具包括 data: 和 blob: urls。
任何人都有使用这种“更好”技术加载 BPG 的工作代码示例? (Fabrice 在他的示例中使用它的方式还不错,当然方法也有取舍,但我认为可能有更好的方法可以通用。)
【问题讨论】:
-
我希望有人回答这个问题,我想补充一下:当前的 js 代码是 C 代码的一个端口——我们能想象原生 js 实现的性能/尺寸改进吗?
-
关于
<img>标签,生成data-url意味着将图片编码成浏览器支持的格式,然后用base64编码。虽然后者很容易,但前者在 javascript 中可能非常慢,例如从bpg_decode提供的纯像素数据编码 PNG 格式。仅使用<img>而不是<canvas>,这似乎是一个很大的开销。并且编码位图在内存方面似乎适得其反。 -
@Pandaiolo - 是的,同意数据网址;但是 blob url 具有类似的浏览器支持,您不必对数据进行 base64 编码。尽管您仍然必须编码为 PNG,然后浏览器必须再次解码,但您至少可以避免它的 base64 方面。
标签: javascript image image-processing bpg