javascript - 如何用javascript导出图像数据

标签 javascript html html5-canvas

我从 Canvas 获取图像数据如下:

var img = mycanvas.toDataURL("image/png;base64;");

然后我将图像数据传递给 anchor 的 href 属性

$("#imagenMapa2").prop("src",img);

问题是,当我尝试下载图像时,chrome 崩溃了, 我尝试使用其他较小的 Canvas 并且可以工作,但是尺寸为

width="2600" height="3400" 

不起作用

感谢任何帮助

最佳答案

问题是浏览器可能适用也可能不适用 length limits to data-URIs 。不幸的是,没有办法解决这个问题,但希望他们增加这个限制。对于现代计算机来说,数据本身不是问题。

解决方法#1

Canvas 本质上是位图,就像图像一样,唯一的区别是它可以使用 JavaScript 进行编辑。

因此,无需将 Canvas 转换为图像,只需将 Canvas 元素插入到 DOM 中即可。从用户的 Angular 来看,它的行为就像图像一样。

如果您需要用户下载图像,您只能让用户右键单击并“另存为”图像(目前大多数浏览器都支持)。

解决方法 #2

另一个选项是使用 Blob 。几乎所有浏览器都支持 Blob,但 almost none support canvas.toBlob() 但是(只有 Firefox 可以,IE 10+ 带前缀),所以你在这里也会遇到限制。

此示例来自MDN's page :

canvas.toBlob(function(blob) {
  var newImg = document.createElement("img"),
      url = URL.createObjectURL(blob);

  newImg.onload = function() {
    // no longer need to read the blob so it's revoked
    URL.revokeObjectURL(url);
  };

  newImg.src = url;
  document.body.appendChild(newImg);
});

解决方法 #3

或者,如另一个答案中所述,使用高压缩比的有损压缩 JPEG。您也会失去 Alpha channel 。

但是,如果您需要尽可能多的跨浏览器兼容性,这可能是剩下的“唯一”选项:

var dataURI = canvas.toDataURL("image/jpeg", 0.2);  // type, enc. option <0.0, 1.0]

解决方法#4

您还可以将原始位图发送至server as ArrayBuffer 在帖子中,然后在服务器端对原始数据进行编码并将图像发送回用户以供下载。

这显然是一个高流量负载选项,并且对用户不太友好,因为您将从用户端向服务器上游发送约 44mb(问题的大小)(考虑到大多数 ADSL 用户的上行流量特别有限)评价这可能需要很长时间考验用户的耐心,这从来都不是一个好主意......)。

如果这是特殊用途,即。内联网或类似的,这是可行的,但通常不推荐。

解决方法#5(原则上)

最后一个选项基本上是使用 JavaScript 使用低级 ArrayBuffer 将原始位图数据编码为 PNG。不过,我还不知道有任何库可以进行编码,所以这个选项目前只能留给漫长的夜晚......

关于javascript - 如何用javascript导出图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29021490/

相关文章:

javascript - 为什么 WebdriverIO 对从未使用过的 webelement 发出 POST 'element' 请求?

javascript - 为什么 Jest 不会运行? "TypeError: environment.setup is not a function"

javascript - 显示来自数据文本属性的数据

javascript - 将所有文本链接转换为实际链接

javascript - 如何将 html5 canvas 绘图下载为图像

javascript - 在 WebGL 中使用图像数组作为纹理

html - 为什么 CSS 中的文本转换在以表单形式提交时不保留转换(大写)?

jQuery'悬停导致div闪烁

javascript - Canvas 中的两个(任意)区域 : figuring out which is bigger

javascript - 在 NodeJS 的 Canvas 上使用多行居中文本