注意:演示的作者,Stéphane Roucheray,是PIMS团队的成员。演示最初发布在Pims World Labs博客上。
基于内容的图像大小调整是一种在不修改图像内容比例的情况下重新调整图像大小的方法,换句话说:非线性图像大小调整。该算法最早由 Shai Avidan 和 Ariel Shamir 解释,并于 2007 年发表(“用于基于内容的图像大小调整的接缝雕刻。”)。
从那时起,已经发布了一些优秀的开源实现。例如,有一个插件用于 Gimp,以及一个用 C++ 编写的独立应用程序CAIR。
但是,由于 Canvas 和 JavaScript,现在可以在浏览器中无需插件即可执行此操作。
从 1.5 版开始,Firefox 通过 Canvas API 提供位图操作。3.5 版不仅引入了有史以来最快的 Firefox JavaScript 引擎,还引入了新的 Canvas 方法 - createImageData - 提供了更强大的环境。
对于此演示,已实现基于内容的图像大小调整算法的一个子部分。可以在不修改高度的情况下交互式地减小图像的宽度。此实现使用接缝雕刻来调整图像大小,减去可见度较低的垂直线。这是一个四步迭代算法。一次迭代是图像宽度减小一个像素。首先将图像加载到 Canvas 上下文中,然后开始迭代
- 必须计算图像的灰度版本
- 计算图像的边缘(在本例中使用Sobel 卷积)及其能量矩阵
- 检测能量最小的接缝(从能量矩阵底部到顶部的 1 像素垂直线)
- 然后从原始图像中删除检测到的接缝的像素,并将结果重新注入到步骤 1 中作为源图像
之前的每个步骤都存储了源图像大小的整个数据矩阵。虽然这些矩阵并非全部都是图像,实际上是算法的产物,但在 ImageData 对象中存储它们比使用简单的数组更方便。这就是使用 Canvas 上下文的 createImageData 方法的原因。此过程的好处之一是允许显示幕后进行的中间计算。
此演示表明,可以执行比仅使用 CSS 平铺图像像素更智能的图像大小调整。在浏览器中直接拥有计算和图像处理功能,为如何向用户显示图像数据开辟了一系列新的可能性。这只是一个小的演示。
关于 Christopher Blizzard
一次发布一个,让网络变得更好。
36 条评论