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

IT技术 javascript html canvas export png
2021-01-26 02:14:32

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

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

6个回答

oop。原始答案是针对类似问题的。这已被修改:

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

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

document.write('<img src="'+img+'"/>');
还有一个问题,如何将我在此标签中获得的图像保存到服务器。有什么猜想吗??
2021-03-18 02:14:32
但是如果我使用 var img = canvas.toDataURL("image/jpeg"); 我得到的背景是全黑的。如何纠正
2021-03-23 02:14:32
哦来吧。我在 2009 年回答过这个问题,你有什么期望?
2021-04-03 02:14:32
@donohoe 实际上你是在 2010 年 8 月回答的 :)
2021-04-05 02:14:32
执行类似var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);. document.write代码使得数据URL,他们制作的HTML字符串,然后把该字符串的一个副本,在DOM,浏览器则必须解析HTML字符串,把另一份图像元素上,然后再分析它打开data URL 转化为图片数据,最后就可以显示图片了。对于需要大量内存/复制/解析的屏幕尺寸图像。只是一个建议
2021-04-07 02:14:32

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

所以你不需要额外的库。

例如

 <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>

从理论上讲,这应该创建然后导航到中间带有绿色方块的图像,但我还没有测试过。

该图像将在您的浏览器中显示为图像。然后您可以将其保存到磁盘或其他任何地方。这是一个快速而肮脏的通用“Canvas2PNG”书签,它将页面中的第一个画布转换为 PNG 并在浏览器中的新窗口中显示它:javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
2021-03-14 02:14:32
如何修改它以渲染多个图像?
2021-03-19 02:14:32
将保存图像的位置。在我当地的位置?
2021-03-22 02:14:32
数据 URI 具有最大长度,因此可以放入数据 url 的图像大小有上限。
2021-03-26 02:14:32
如果图像大小为几 MB,请准备使您的浏览器崩溃(我曾在 FireFox 中这样做过)。
2021-04-04 02:14:32

我想我会稍微扩展一下这个问题的范围,在这个问题上有一些有用的花絮。

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

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 方法时会遇到安全错误。

@So4ne 我不这么认为,它必须是一个图像/八位字节流来提示用户下载。如果去掉那一行,页面最终会重定向到图像。不过,我很想知道其他人是否知道一种方法可以很好地做到这一点。
2021-03-13 02:14:32
这很棒。谢谢!但是如果我想保存到服务器而不是本地呢?表单文件输入是否接受 img src 作为可上传的内容?
2021-03-15 02:14:32
用你的下载文件的解决方案,我必须选择我要使用的软件,有点不方便......有没有办法在下载后重新将mime替换为png?
2021-03-22 02:14:32
在 <a> 链接和 .click() 上使用 target="_blank" 它也应该可以触发下载(使用 FF 数据 urls 和 download="filename" for text/csv 和 text/plain 测试)
2021-03-28 02:14:32
oop。刚刚找到答案。留下上一个问题,以防其他人也在寻找stackoverflow.com/questions/13198131/...
2021-04-07 02:14:32
function exportCanvasAsPNG(id, fileName) {

    var canvasElement = document.getElementById(id);

    var MIME_TYPE = "image/png";

    var imgURL = canvasElement.toDataURL(MIME_TYPE);

    var dlLink = document.createElement('a');
    dlLink.download = fileName;
    dlLink.href = imgURL;
    dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');

    document.body.appendChild(dlLink);
    dlLink.click();
    document.body.removeChild(dlLink);
}
在 Chrome 中它显示“网络错误”,而在 Firefox 中它运行良好。(在 Linux 上)
2021-03-11 02:14:32
这是一个不错的解决方案,只是它可能不适用于 IE。出现错误“传递给系统调用的数据区域太小”
2021-03-12 02:14:32
保存的文件保持为 .svg 格式。如何将其保存为png?
2021-03-20 02:14:32

我会使用“ wkhtmltopdf ”。它只是很好用。它使用webkit引擎(用于Chrome、Safari等),使用起来非常简单:

wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf

就是这样!

尝试一下

2021-03-31 02:14:32
我也在 wkhtmltopdf 阵营。我们一直在使用它进行存档,它的功能令人惊叹。
2021-04-07 02:14:32
如何在需要登录信息的页面中使用 WKHTMLtoPDF?我正在使用 Jsreport 转换为 PDF,但我使用 HTML2Canvas 捕获我的内容,我在将 Canvas 作为参数发送到 JSreport 时遇到问题
2021-04-07 02:14:32