【问题标题】:Image scaling or DOM duplicating algorithm in JavaScript?JavaScript 中的图像缩放或 DOM 复制算法?
【发布时间】:2013-06-24 13:09:20
【问题描述】:

原始问题
如何在没有 CSS 支持的情况下在 JavaScript 中缩放图像?

我的团队有一个 STB 环境,有点像 EPG,它支持 JavaScript 和 DOM。 CSS 支持存在,但我们不能在那里注入我们自己的 CSS。测量单位始终是固定的,因此无法通过 CSS 进行缩放。

我们以以下方式显示图像:

  1. 每个图像都显示为从 设备
  2. 对于40 x 30 图像,它为我们提供12001px x 1px, 表示为 DOM 元素。
  3. 它们被放置在父 DOM 元素内的width x height 列和行中。它们在物理像素较大的大屏幕上看起来更大。

请看下面的图片 - 为了清楚起见,我在 浏览器 中尝试过:

假设上面的每个块本身都是一个 1 x 1 像素的图像,因此是一个 DOM 元素。一次总有 40 x 30 = 1200 个 DOM 元素。

我们想在函数调用中对其进行缩放,使其大小翻倍。或者至少在宽度和高度上增加 10 个单位。

我用 JavaScript 编写什么逻辑?我是否复制每个 DOM 元素并将副本放在原始元素旁边?这只会使宽度增加一倍。我也乘以4倍的高度吗? 帮助表示赞赏。

更新
从唯一的答案看来,我需要的是在 JavaScript 中实现缩放或复制算法。

当我们在任何操作系统中缩放图像时,它们对每个像素应用什么算法以使其大小翻倍并显示 1 个像素 x 4 个硬件像素?

我需要对 DOM 元素做同样的事情,其中​​每个 spanimg 元素都充当一个像素。

【问题讨论】:

  • 是的,我认为将这些元素水平和垂直加倍是唯一的方法。不过我可能弄错了..

标签: javascript dom mathematical-optimization


【解决方案1】:

据我所知,您仅限于两种选择:

  • 单个 dom 像素大小的两倍
  • 或者,如果这不可行,请将像素图缩放到 dom 像素数的两倍(因此将每个像素添加两次并在最后复制每一行)

当然,第一个选项是迄今为止最有效的选项,但您工作的环境似乎非常受限制,所以我认为这是不可能的。

【讨论】:

  • 假设我加倍没有。 DOM 元素,如何放置它们,以及下一个元素?我必须复制第一个 img 并将其放置在第二个 img 的位置。然后原来的第二个img 代替了第三个和第四个。然后是第四个img等等……这是一个非常密集的操作。什么是有效的方法?
  • 如果你已经有一张完整的地图,那么我认为最有效的方法是说l = row[x].lenght 并从l to 0 循环移动row[x][l*2] = row[x][l];row[x][l*2-1] = row[x][l] 在每个循环中。然后,一旦你完成,实际上对行而不是单元格做同样的事情。至少,这是假设它是一个普通的数组结构,而不是一些奇怪的对象或字节数组。
  • 我需要在二维上做同样的事情,分别为每行的列元素。复杂度将超过n^2。任何低于此的内容
【解决方案2】:

如果您打算只使用图像,而不是像素,则该功能是现成的,

使用这个link

这可以毫无问题地提供最佳图像插值,

如果你想手动做,

然后在行中加倍,然后在列中,表示先水平,然后垂直加倍,

示例(3x3)

XCV
DFG
ERT

它将在第一行像素乘数中变成这个

XXCCVV
DDFFGG
EERRTT

然后是列像素乘数

XXCCVV
XXCCVV
DDFFGG
XXCCVV
EERRTT
XXCCVV

在这里,您可以在每行下方插入重复的行, 您可以在第一步中应用相同的方法,如果您正在创建矩阵,那么它将帮助您将每个相乘..

我希望这会有所帮助..

【讨论】:

  • +1。谢谢。我检查了您帖子中所有可用的链接,其中只有带有算法的链接才有用。 Rest 使用了本机软件功能,例如将画布大小加倍并使用画布做事。我接受原来的第一个答案。
  • 仅供参考,也许所选答案的第二个选项效果不佳,因为它会显示像一张拉伸图像和另一张相同的图像。我希望这会有所帮助..
  • 单位为一个像素(或块),无法进一步解剖。因此,如果我们将所有单元水平加倍,然后复制此水平行,理论上它应该可以工作。这在我看来是合乎逻辑的!
  • 谢谢 :),它是 C 图形的基础,但最好的是 hq3 但我不知道你将如何实现,仅供参考链接en.wikipedia.org/wiki/Image_scaling#hqnx_family
猜你喜欢
  • 2012-12-25
  • 2013-06-04
  • 2016-08-17
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2011-09-10
相关资源
最近更新 更多