【发布时间】:2012-04-04 02:44:53
【问题描述】:
当使用 toDataUrl() 设置图像标签的来源时,我发现保存时的图像比原始图像大很多。
在下面的示例中,我没有为 toDataUrl 函数指定第二个参数,因此使用了默认质量。这导致图像比原始图像尺寸大得多。当指定 1 表示完整质量时,生成的图像会更大。
有人知道为什么会发生这种情况或我该如何阻止它吗?
// create image
var image = document.createElement('img');
// set src using remote image location
image.src = 'test.jpg';
// wait til it has loaded
image.onload = function (){
// set up variables
var fWidth = image.width;
var fHeight = image.height;
// create canvas
var canvas = document.createElement('canvas');
canvas.id = 'canvas';
canvas.width = fWidth;
canvas.height = fHeight;
var context = canvas.getContext('2d');
// draw image to canvas
context.drawImage(image, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight);
// get data url
dataUrl = canvas.toDataURL('image/jpeg');
// this image when saved is much larger than the image loaded in
document.write('<img src="' + dataUrl + '" />');
}
谢谢你:D
这是一个例子,不幸的是图像不能跨域,所以我只需要拉一个 jsfiddle 图像。
图像是 7.4kb,如果你保存正在输出的图像,你会看到它是 10kb。使用更详细的图像时,差异会更加明显。如果将 toDataUrl 质量设置为 1,则图像为 17kb。
我也在为此使用 FireFox 10,当使用 Chrome 时,图像尺寸仍然更大,但没有那么大。
【问题讨论】:
-
dataUrl 存储在
base64中,而不是二进制(大小增加 1/3)。此外,浏览器中使用的存储算法可能不如最初使用的那么优化。 -
这仅适用于远程存储的图像,使用文件输入加载的图像大小正确。
-
它们是一样的吗?真实站点上的远程图像可能会得到更好的优化。
-
我知道我作为示例使用的远程图像是 59kb。从上面生成的图像标签重新保存后,图像被称为 134kb。将此 59kb 图像保存到我的 HD,然后将结果上传到 59kb 图像。由于某种原因,当图像是远程的时,它会使生成的图像变得更大。
-
非常好的问题,因为有很多文章展示了如何在客户端上“缩小”图像,然后再将其上传到服务器。然而,我读过的文章都没有提到这个数据膨胀问题。只有在浪费了几个小时之后,人们才意识到画布并不是一个很好的图像调整解决方案。 +1
标签: javascript canvas data-url