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

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


当前回答

在某些版本的Chrome上,您可以:

使用绘制图像函数ctx.drawImage(image1,0,0,w,h);在画布上单击鼠标右键

其他回答

我想我会把这个问题的范围扩大一点,在这个问题上提供一些有用的花絮。

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

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流。还值得一提的是,如果在渲染画布时使用任何跨域资源,则在尝试使用toDataUrl方法时会遇到安全错误。

如果你想让画布消失,你可以使用这个片段

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id=canvas width=200 height=200></canvas>
    <iframe id='img' width=200 height=200></iframe>
    <script>
        window.onload = function() {
            var canvas = document.getElementById("canvas");
            var context = canvas.getContext("2d");
            context.fillStyle = "green";
            context.fillRect(50, 50, 100, 100);
            document.getElementById('img').src = canvas.toDataURL("image/jpeg");
            console.log(canvas.toDataURL("image/jpeg"));
        }
    </script>
</body>
</html>

如果您正在使用jQuery(很多人都这么做),那么您可以这样实现接受的答案:

var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");

$("#elememt-to-write-to").html('<img src="'+img+'"/>');

简单的答案就是获取它的blob并将imgsrc设置为该blob的新对象URL,然后使用一些库将该图像添加到PDF中,例如

var ok=document.createElement(“画布”)正常宽度=400ok.height=140var ctx=ok.getContext(“2d”);for(设k=0;k<ok.height;k++)(k% 数学楼层((数学.随机()) *10)== 0)&&(y=>){对于(var i=0;i<ok.width;i++){如果(i%25==0){ctx.globalAlpha=数学随机()ctx.fillStyle=(“rgb(”+数学random()*255+“,”+数学random()*255+“,”+数学random()*255+“)”);(wdth=>ctx.fill矩形(数学.sin(i*数学.PI/180) * 数学.随机()*ok宽度,数学科(i*数学PI/180,)*wdth+y,wdth中,世界贸易组织))(15)}}})(k)ok。toBlob(blob=>{k.src=URL.createObjectURL(blob)})<img id=k>

或者,如果您想使用低级字节数据,可以获取画布的原始字节,然后根据文件规范将原始图像数据写入数据的必要字节。您只需要调用ctx.getImageData(0,0,ctx.canvas.widht,ctx.画布.height)来获取原始图像数据,然后根据文件规范将其写入

从<canvas/>上载图像:

async function canvasToBlob(canvas) {
  if (canvas.toBlob) {
    return new Promise(function (resolve) {
      canvas.toBlob(resolve)
    })
  } else {
    throw new Error('canvas.toBlob Invalid')
  }
}

await canvasToBlob(yourCanvasEl)