基于内容的图像大小调整

注意:演示的作者,Stéphane Roucheray,是PIMS团队的成员。演示最初发布在Pims World Labs博客上。

在 Firefox 3.5 中查看演示。

基于内容的图像大小调整是一种在不修改图像内容比例的情况下重新调整图像大小的方法,换句话说:非线性图像大小调整。该算法最早由 Shai Avidan 和 Ariel Shamir 解释,并于 2007 年发表(“用于基于内容的图像大小调整的接缝雕刻。”)。

从那时起,已经发布了一些优秀的开源实现。例如,有一个插件用于 Gimp,以及一个用 C++ 编写的独立应用程序CAIR

但是,由于 Canvas 和 JavaScript,现在可以在浏览器中无需插件即可执行此操作。

从 1.5 版开始,Firefox 通过 Canvas API 提供位图操作。3.5 版不仅引入了有史以来最快的 Firefox JavaScript 引擎,还引入了新的 Canvas 方法 - createImageData - 提供了更强大的环境。

对于此演示,已实现基于内容的图像大小调整算法的一个子部分。可以在不修改高度的情况下交互式地减小图像的宽度。此实现使用接缝雕刻来调整图像大小,减去可见度较低的垂直线。这是一个四步迭代算法。一次迭代是图像宽度减小一个像素。首先将图像加载到 Canvas 上下文中,然后开始迭代

  1. 必须计算图像的灰度版本
  2. 计算图像的边缘(在本例中使用Sobel 卷积)及其能量矩阵
  3. 检测能量最小的接缝(从能量矩阵底部到顶部的 1 像素垂直线)
  4. 然后从原始图像中删除检测到的接缝的像素,并将结果重新注入到步骤 1 中作为源图像

之前的每个步骤都存储了源图像大小的整个数据矩阵。虽然这些矩阵并非全部都是图像,实际上是算法的产物,但在 ImageData 对象中存储它们比使用简单的数组更方便。这就是使用 Canvas 上下文的 createImageData 方法的原因。此过程的好处之一是允许显示幕后进行的中间计算。

此演示表明,可以执行比仅使用 CSS 平铺图像像素更智能的图像大小调整。在浏览器中直接拥有计算和图像处理功能,为如何向用户显示图像数据开辟了一系列新的可能性。这只是一个小的演示。

关于 Christopher Blizzard

一次发布一个,让网络变得更好。

更多 Christopher Blizzard 的文章……


36 条评论

  1. Markus

    非常令人印象深刻。但它真的是那么慢,还是您只是让演示变慢以可视化算法?

    2009年6月8日 09:15

  2. Paul

    @Markus 第一次处理很慢。但之后,它真的非常流畅(尝试通过句柄调整图像大小)。

    2009年6月8日 09:24

  3. sroucheray

    @markus:我注意到在不同平台上的渲染速度不同。但是,该算法需要大量的计算,并且是迭代的。这意味着在计算“宽度 - 1 像素”的图像之前,无法计算“宽度 - 2 像素”的图像。这是它看起来很慢的部分原因。
    为了提高性能,最好尝试取消选中“在处理过程中刷新图像”。显示中间图像会导致计算时间损失。该算法尝试尽可能快地进行计算并存储中间结果。因此,您可以在处理过程中使用它。

    2009年6月8日 09:40

  4. John Drinkwater

    可能另一个演示可以使用它来展示 Web Workers;)

    2009年6月8日 09:57

  5. Fred

    不确定 Web Workers 在那里会有多大帮助,除了在它们运行时不会阻塞 JS 执行之外。为了让多个工作线程带来很大的加速,我希望该算法需要能够并行化。

    2009年6月8日 13:43

  6. Boris

    使用 keydown 而不是 keypress 用于箭头键操作是否有原因?后者应该在跨浏览器方面更好地工作,以保持按键按下……

    2009年6月8日 13:48

  7. […] 原始地址:https://hacks.mozilla.ac.cn/2009/06/content-aware-image-resizing/ […]

    2009年6月9日 02:45

  8. […] 基于内容的图像大小调整算法的 Javascript 实现 »(更多细节在此)分类于 (X)HTML、CSS & Cie、链接、迷你帖子 […]

    2009年6月9日 02:50

  9. […] 文章在此 https://hacks.mozilla.ac.cn/2009/06/content-aware-image-resizing/ […]

    2009年6月9日 05:21

  10. […] 基于内容的图像大小调整 […]

    2009年6月11日 05:57

  11. Pjdkrunkt

    我不明白。让我的硬盘驱动器连续工作 10 分钟以在图像的某些部分产生奇怪的变形,这如何算得上是 Web 的改进?搜索图像“非活动”区域的初始代码库应该只用于裁剪图像。大多数图像属于以下三种类别之一……左侧或右侧较重、中心较重、顶部或底部较重。扫描图像、确定它是哪种类型并简单地进行裁剪以达到效果,这似乎会快得多。也许图像描述中甚至可以包含一个标签来指定使用哪种方法,这不仅可以减少所有这些疯狂的计算,还可以让设计师确保不会意外地裁剪掉错误的东西。

    我并不是为了挑刺而这么说,作为摄影界的成员,你会惊讶于当摄影师发现他们的 Web 浏览器正在破坏他们图像的完整性时会多么生气。通过挤压进行的典型图像大小调整可能很粗糙甚至很丑陋……但至少它是诚实的……而且任何人都可以“重新挤压”图像以查看它最初的样子。这个“功能”走得太远了,它破坏了原始图像的完整性,这几乎是犯罪。这并不是说程序员没有做得很好,这是一段非常复杂的程序……但这里需要考虑一个道德问题。仅仅因为您可以直接在浏览器中进行高级别的 Photoshop 编辑,并不意味着您应该这样做。

    请考虑一下去年仅有的那些因 Photoshop 图像而陷入丑闻的记者的案例。特别是对于艺术家和专业艺术摄影师来说……从这些图像中“窃取”的“空白区域”不仅仅是空白区域。它被称为负空间,并且在传达图像含义方面,它通常与显而易见的主题一样重要,有时甚至更重要。坐在台阶上的一群人就是一个很好的例子……在最初的照片中,人们之间有很多空间,照片友好而诱人。在“调整大小”后,它变成了一个狭窄的幽闭恐惧症氛围。现在,同一张图像具有完全不同的感觉。裁剪也可能对图像完整性造成危害,但至少它被认为是一种正常的出版实践。

    2009年6月11日 17:48

  12. Nickolay

    Pjdkrunkt:Firefox 不会自动执行此转换。这只是一个示例,说明由于改进的 JS 速度和 Canvas,您可以在 JavaScript 中编写什么程序。

    2009年6月12日 04:27

  13. Alex

    有一个 CSS 属性来定义在调整图像大小时要使用的方法会很有用
    .img {
    resize-policy: liquid;
    resize-policy: linear;
    resize-policy: crop;
    }

    2009年6月12日 05:05

  14. Jep

    太糟糕了;)
    现在有了一个新的最先进的算法!
    ( http://www.vimeo.com/5024379 )

    2009年6月17日 06:00

  15. […] Firefox 3.5 可以做的事情(全部原生,无需插件)基于内容的图像大小调整 https://hacks.mozilla.ac.cn/2009/06/content-aware-image-resizing/ 眨眼检测 http://ajaxian.com/archives/finally-a-useful-blink-tag-detecting-your-user-blinking […]

    2009年6月26日 00:23

  16. […] 3.5 的新功能,甚至还有一些开发人员如何利用新工具突破 Web 限制的示例。分享和 […]

    2009年6月26日 17:23

  17. […] 3.5 的新功能,甚至还有一些开发人员如何利用新工具突破 Web 限制的示例。发布在 IT/科技、新闻、事实和灵感 | 发表评论 […]

    2009年6月27日 21:27

  18. […] 如果您想了解有关 Firefox 3.5 及其新功能的更多信息,请查看我们列出的先前报道的链接,或访问 Mozilla 的 Chris Blizzard 的博客。Blizzard 几乎完成了他的 35 天项目,在该项目中,他重点介绍了 Firefox 3.5 的新功能,甚至还有一些开发人员如何利用新工具突破 Web 限制的示例。 […]

    2009年6月28日 11:56

  19. […] 在 35 天的时间内展示了不同的 3.5 功能,并且还展示了开发人员在新的 […] 中可以利用的新工具

    2009年6月28日 12:08

  20. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年6月29日 21:40

  21. […] 在 35 天的时间内,展示了 3.5 版本的不同功能和特性,此外还介绍了开发人员在新 […] 中可以利用的新工具。

    2009年6月30日 09:33

  22. […] 在 35 天的时间内展示了不同的 3.5 功能,并且还展示了开发人员在新的 […] 中可以利用的新工具

    2009年6月30日 10:46

  23. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年6月30日 23:56

  24. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年7月1日 01:22

  25. Firefox 3.5 中未公开的新功能……

    Firefox 3.5 现已推出,Mozilla 再次推动了 Web 的发展,这次是第一个发布支持更多 Web 标准、即将推出的标准和一些非常有用的 HTML5 支持的新最终浏览器的浏览器!

    那么 Firefox 3.5 中有哪些新功能……

    2009年7月1日 07:01

  26. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具。此外,尽管 […]

    2009年7月1日 12:42

  27. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年7月2日 01:25

  28. […] 去年 11 月,被认定为会阻碍发布的错误数量超过 250 个,在最近几个月里,这个问题得到了解决,但由于某些原因,包括第一个候选版本也由于剩下的顽固错误而延迟了几个星期。然而,在 pre-RC1 和 RC1 发布后,他们加快了速度,并在短时间内在网络上发布了另外三个候选版本。在过去的 35 天里,Mozilla 逐步介绍了新的选项,同时还介绍了为开发人员提供的工具。 […]

    2009年7月3日 00:25

  29. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年7月3日 09:42

  30. […] 在其网站上介绍了这个新版本。此外,还为开发人员和程序员介绍了一些新工具 […]

    2009年7月5日 23:08

  31. […] 原始地址:https://hacks.mozilla.ac.cn/2009/06/content-aware-image-resizing/ […]

    2009年7月6日 05:49

  32. […] 该文本是 hacks.mozilla.org 网站上发布的文章“基于内容的图像大小调整”的翻译版本,根据知识共享署名 3.0 许可发布 […]

    2009年7月20日 13:56

  33. 设计

    Ugh,不,液体缩放(这就是它所做的)对于日常缩放来说非常糟糕。从内容制作的角度来看,它确实有价值,但它会在图像中引入许多伪影和奇怪的东西,我绝对不希望我的浏览器自动对任何我查看的图像执行此操作。

    2009年9月24日 06:31

  34. kourge

    @Alex:image-rendering 是您要查找的 CSS 属性。我相信 IE 等效项是 -ms-interpolation-mode。

    2009年9月24日 13:25

  35. ivo

    不错的工具,但作为一名网页开发者,你不再知道你的用户看到了什么。

    2010年2月24日 06:53

  36. Max

    还有另一个易于使用的内容感知缩放软件 iResizer
    http://www.iresizer.com

    2012年2月15日 14:54

本文评论已关闭。