协慌网

登录 贡献 社区

将 HTML Canvas 捕获为 gif / jpg / png / pdf 吗?

是否可以捕获或打印 html 画布中显示为图像或 pdf 的内容?

我想通过画布生成图像,并能够从该图像生成 png。

答案

哎呀。原始答案是针对类似问题的。对此进行了修订:

var canvas = document.getElementById("mycanvas");
var img    = canvas.toDataURL("image/png");

使用 IMG 中的值,您可以将其写为新图像,如下所示:

document.write('<img src="'+img+'"/>');

HTML5 提供了 Canvas.toDataURL(mimetype),可在 Opera,Firefox 和 Safari 4 beta 中实现。但是,存在许多安全限制(主要与将其他来源的内容绘制到画布上有关)。

因此,您不需要其他库。

例如

<canvas id=canvas width=200 height=200></canvas>
 <script>
      window.onload = function() {
          var canvas = document.getElementById("canvas");
          var context = canvas.getContext("2d");
          context.fillStyle = "green";
          context.fillRect(50, 50, 100, 100);
          // no argument defaults to image/png; image/jpeg, etc also work on some
          // implementations -- image/png is the only one that must be supported per spec.
          window.location = canvas.toDataURL("image/png");
      }
 </script>

从理论上讲,这应该创建然后导航至中间带有绿色正方形的图像,但是我尚未进行测试。

我以为我会扩大此问题的范围,并提供一些有关此事的有用提示。

为了使画布作为图像,您应该执行以下操作:

var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png");

您可以使用它来将图像写入页面:

document.write('<img src="'+image+'"/>');

其中 “image / png” 是 mime 类型(png 是唯一必须支持的类型)。如果您想要一个受支持的类型的数组,可以按照以下方式进行操作:

var imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/tiff']; //Extend as necessary 
var acceptedMimes = new Array();
for(i = 0; i < imageMimes.length; i++) {
    if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0) {
        acceptedMimes[acceptedMimes.length] = imageMimes[i];
    }
}

您只需要在每个页面上运行一次 - 绝不应该在页面的整个生命周期内对其进行更改。

如果您希望用户下载文件,请执行以下操作:

var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); //Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;

如果您将其与其他 mime 类型一起使用,请确保更改 image / png 的两个实例,但不要更改 image / octet-stream。还值得一提的是,如果在渲染画布时使用任何跨域资源,则在尝试使用 toDataUrl 方法时会遇到安全错误。