【问题标题】:Scaling down image with Hermite-resize creates thin black line out of nowhere使用 Hermite-resize 缩小图像会突然产生细黑线
【发布时间】:2015-09-14 16:48:39
【问题描述】:

我必须缩小图像并在浏览器中将它们转换为 jpeg。为此,我一直在使用一个名为Hermite-resize的javascript调整大小函数@

这很好用。在重新调整了几百张图像的大小后,我注意到每隔一段时间就会发生一次奇怪的事情。对于某些图像,缩小的 jpeg 图像底部会出现一条细黑线。

我认为这可能是由于在缩小版本中呈现了透明线。转换为 jpeg 后,由于 jpeg 将无背景变为黑色背景,因此线条变为黑色。

但是,如果我在将图像渲染为 jpeg 之前在图像后面放置一个白色背景,那么问题仍然存在。

如果有人知道这是什么造成的,或者如何解决它,我将不胜感激。

一个 jsfiddle 来澄清我的意思:

canvas.getContext("2d").fillStyle = '#FFF';
canvas.getContext("2d").fillRect(0, 0, W2, H2);
canvas.getContext("2d").putImageData(img2, 0, 0);
document.getElementById("imageid").src = canvas.toDataURL("image/jpeg");

http://jsfiddle.net/gt4r54zr/1/

我不确定它是否相关,但如果我在 Hermite 脚本中将透明度设置为完全 (255),那么同样的黑线也会出现:

data2[x2 + 3] = 255;// Original value: gx_a / weights_alpha;

http://jsfiddle.net/3osq1s1w/3/

【问题讨论】:

  • 这只发生在精确的像素值上吗?
  • 优秀的问题邀请。实际情况就是这样。对于示例中的图像,我将所有像素值放入 pastebin (pastebin.com/C43FM9k8)。不过,我没有看到太多的模式。虽然我不太明白怎么做,但 rphv 的回答似乎确实解决了我的问题,所以我很高兴 :)。

标签: javascript image image-resizing


【解决方案1】:

函数resample_hermite() 计算这些比率:

var ratio_w_half = Math.ceil(ratio_w/2);
var ratio_h_half = Math.ceil(ratio_h/2);

最终用于确定重新调整大小的图像的尺寸。注意Math.ceil,它将(ratio_h/2) 舍入到下一个最大整数。在(ratio_h/2) 的尾数(即小数点右边的所有内容)小于0.5 的情况下,似乎会呈现黑线。在这些情况下,计算出的图像高度太大了一个像素,并且没有数据可以填充这些像素。

变化

var ratio_h_half = Math.ceil(ratio_h/2);

var ratio_h_half = Math.round(ratio_h/2);

似乎解决了您的示例中的问题。

【讨论】:

  • 谢谢rphv!!虽然我很难理解如何,但您的回答似乎确实解决了我的问题。我对此示例图像的所有令人不安的像素高度进行了尝试,但没有一个引起问题。我试着看尾数,但我没有看到你描述的模式。不过我可能做错了。 (如果您愿意,可以在 pastebin.com/C43FM9k8 找到值)
  • 很高兴为您提供帮助。您的数据确实显示了我确定的模式 - 让我澄清一下。考虑(Original height / new height) / 2:在所有情况下,mantissa(也是有效位,或“小数点右侧的数字部分”)小于0.5。这意味着Math.round()Math.ceil() 将返回不同的值——例如,Math.round(4.1666666667) = 4,但Math.ceil(4.1666666667) = 5。在这些情况下,调整后图像的计算尺寸有点过大,多余的空间会被黑线填充。
  • 感谢 rphv 进一步详细说明这一点。我了解舍入差异以及它如何导致这种影响。但是,对于尾数小于 0.5 的所有值,这不会发生。我想还有另一个因素。但是,代码中的整个计算有点超出我的想象。我试图了解发生了什么,但这本身可能是一个错误;)。现在我真的很高兴我的照片能正确渲染:D。谢谢你!
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2011-12-11
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多