如何使用html2Canvas自动下载屏幕截图

4

我有一个显示图表的画布,我正在尝试使用以下代码使用html2canvas()对画布进行截屏:

<div class="chartContainer" id="chart1"></div>
<div id="displayCanvas" style="display:none;" class="stx-dialog"></div>

html2canvas($('#chart1'),{onrendered:function(canvas1) 
{$('#displayCanvas').append(canvas1)}});

当图表容器被加载时,它使用id为"displayCanvas"的div并追加canvas的截图。

我怎样才能下载显示出来的canvas截图呢?我已经尝试使用以下内容下载图片:

var link = document.createElement('a');
link.download = stx.chart.symbol+".png";
link.href = stx.chart.canvas.toDataURL("png");
link.click();

但它只会将画布上的数据作为图像下载,而不包括背景(它不会下载屏幕截图,只下载数据),当下载后打开时,会显示一个带有数据的黑色屏幕。有人能帮我直接从html2Canvas()中获取屏幕截图并下载图像吗?

4个回答

17

试试这个:

在 HTML 中:

  1. 给你想要截图的元素,添加一个 ID 为“capture”。
  2. 给你需要点击以进行截图的按钮/元素,添加一个 ID 为“btn”。
  3. 加载 html2canvas.min.js 文件。

在 JavaScript 中:

  1. 创建 capture() 函数。
  2. capture() 函数绑定到你正在使用的任何事件上——在这种情况下是在 btn 的 click 事件上。
  3. 完成!当你点击 btn 时,看魔术发生。

HTML:

<h1 id="capture">Hellooooo</h1>
<button id="btn">Capture</button>
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>

Javascript:

function capture() {
    const captureElement = document.querySelector('#capture') // Select the element you want to capture. Select the <body> element to capture full page.
    html2canvas(captureElement)
        .then(canvas => {
            canvas.style.display = 'none'
            document.body.appendChild(canvas)
            return canvas
        })
        .then(canvas => {
            const image = canvas.toDataURL('image/png')
            const a = document.createElement('a')
            a.setAttribute('download', 'my-image.png')
            a.setAttribute('href', image)
            a.click()
            canvas.remove()
        })
}

const btn = document.querySelector('#btn')
btn.addEventListener('click', capture)

这是JSFiddle的链接

小贴士:如果你想要捕获整个文档/网页,只需将“capture”ID添加到<body>标签即可。


这并不会自动下载它。你正在添加一个按钮。对于有许多图像的本地作业来说,这是无用的。然后,您需要编写一个脚本来单击该按钮,这是一种解决方法吧。 - ThickMiddleManager
@ThickMiddleManager 这个函数确实会自动下载截图。按钮只是为了将函数绑定到某个事件以供演示。是函数自动下载截图。您可以将该函数绑定到任何事件上,例如页面加载或在此情况下,按钮单击,然后它仍会自动下载截图。它适用于任意数量的元素和/或图像。如果您想连续下载多个元素的截图,则可以在循环中运行该函数。它适用于任何本地开发环境。我已经测试过了,它可以工作。 - Ludolfyn
@Ludolfyn 我尝试了那段代码,但是出现了一些问题:我没有获取整个HTML页面的图像,只截取了当前显示的某个区域。 - userSLK
嘿 @userSLK,你只需要将 document.querySelector('#capture') 更改为 document.querySelector('body')。然后它就可以捕获整个页面了。有了这部分,你可以选择想要捕获的任何部分。在这里查看 JSFiddle 示例:https://jsfiddle.net/Ludolfyn/dzvb4q7y/47/ - Ludolfyn

0
如果图片有黑色背景,则您的图表必须在屏幕上可见,因为html2canvas类似于截屏。如果您想将数据转换为画布,则必须确保数据出现在屏幕上。

当我使用canvas.toDataURL("png")时,图像没有背景,只有数据被下载。如果我在画图中打开保存的png文件,则会显示带有白色背景的图像;但是,如果我直接使用查看器打开图像,则只显示带有黑色背景的图像,这使得读取数据更加困难。 - Phoenix

0
这对我有用:
HTML
<div id="canvasDiv">
    <canvas id="canvas" height="100" width="100">
        Your browser does not support the HTML canvas tag.
    </canvas>
 </div>
<button onclick="screenShot()" type="button">Take a screenshot</button>

JavaScript

function screenShot(){
    html2canvas(document.querySelector("#canvasDiv")).then(canvas => {
        var dataURL = canvas.toDataURL( "image/png" );
        var data = atob( dataURL.substring( "data:image/png;base64,".length ) ),
            asArray = new Uint8Array(data.length);

        for( var i = 0, len = data.length; i < len; ++i ) {
            asArray[i] = data.charCodeAt(i);    
        }

        var blob = new Blob( [ asArray.buffer ], {type: "image/png"} );
        saveAs(blob, "photo.png");
    });
}

我刚刚使用了html2canvas网站提供的代码,然后我使用了this code来下载屏幕截图。

0

如果有人在使用React,这里是一些你可以复制的代码:

async function download() {
    const canvas = await html2canvas(document.querySelector("#screenshot"));
    canvas.style.display = "none";
    document.body.appendChild(canvas);
    const image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
    const a = document.createElement("a");
    a.setAttribute("download", `info.png`);
    a.setAttribute("href", image);
    a.click();
}

<a href="#" onClick={() => download()}>Download</a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接