如何将画布保存为png图像?

sne*_*aky 70 javascript html5 canvas

我有一个带有绘图的canvas元素,我想创建一个按钮,当单击它时,它会将图像保存为png文件.所以它应该打开保存,打开,关闭对话框......

我是用这个代码做的

var canvas = document.getElementById("myCanvas");
window.open(canvas.toDataURL("image/png"));
Run Code Online (Sandbox Code Playgroud)

但是当我在IE9中测试它时,会打开一个新窗口,说"网页无法显示",其网址为:

数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAAmAAAABpCAYAAACd + 58xAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADRwSURBVHhe7V0HgBVF0q7ZJSlJwRxAPUFRD39RFLN34qGnnomoqIjhzBlFPROIgsoZzogR5AQEzJ4BPFAUEUwgJjgQkCQKooggaf/6el6/6ZnpSW/zUn237u5MdXX1172 + z6rqaqeEG6VsJet + PDW/vkdrfx3H3yfT2tVzaP26X6hkw1q/BoeI/280/29JwznZxJPUyXtBQBAQBAQBQaBcECjefmi56BWlZYtAeqajx/WokfrJYEqOIikOFRfXoVq161PtOk2odu0t + ectqKiojnrntWhC46QhYOtXfUarl79Ivy9/ldau + H + TX/8b2SbjJ07pWFQy2Uqnp2yXSrQJAoKAICAICALJCAgBS8ao8iTi/UvpSZlBxiwqwWOKimsxCWtEdettR3XqbEfFtRonkrBYArZh3fe0 + senadWyEbRm1UzasP53K45ZiFc84RKyVXkbVUYWBAQBQUAQyIqAELCsiFW2fDQpSyZk8UQMMysqKmaPWCOqt8mOVK/eTuQU1YuccCQBW7dyIq38/J5A/fN的/ ad3a5QGXmqsvLfGKJl0ZCFdONEOPyl5lGV8QEAQEAUGghiMgBKzqLHCeHqVOrILtduF4MpZExEqoVq167A3bmjap34J/bmoFqcj2dM3Pr9GK + b1p5bJXmXz9nEC + 3FiorYF4hcmXlo + gUrk +微米/ + E + QoVWfxxRJBQBAQBAQBQUAQqBwE8uzCwiMiaEqOWYR5jJ2/6Hl58nYHk0Pr1v1Ov62cTytXfE5r1yyyc6RgDhjI16 + L + tLqFZ9xnteGUKc0Xi876YpYkFDCfpqFEz9YGpRERhAQBAQBQaB8ERAPWPnim157JreX6/eK7eJ/Ge0RS8oPc9gT1pTqN2jFocltfdPxecBU2HHxgB TKY + 71CjPGCO + YyU4j0TU9ZcGf0y + JSAoCgoAgIAgIAoJATUcgG2dQ0jpKZ/XP + PlLtEcs3huGQhO/r17K3rBvuGrEUt8i5HPAkHC/Yt6lKuwYKiuRM9TtGbY0rcerTBLwC/KY1fSNJ/MTBAQBQUAQqAwExANWGaiHx0z2aJl9CknET + MRc2XsVSKKaNP6O1CDhvtwYn5dJZf3gOG0IxLuS0e + LB4vw9sVhiwmHywmF6xqLLdYIQgIAoKAICAICAJVAQHTo2XmkNtzv6K5R7RXLOwRs3MaW + 47SNkG9oRxZQmun6qbImCo84VSE + 5pR3/zvFZJni/7e8tTHiCeqCkAqsKKig2CgCAgCAgCgoAgUG0RCBKzMLmwkzHdL4pk4XlUAn7Uu3XrVtPqVfO4lurPSq0KQa5cdAv9snBgqM5XFPlKSsSPM8o3mcxES2hZtf0rEMMFAUFAEKiBCEgIsqotavpk/OiwZViHPQk/LgHfHo5EnbCGjVpxeYo9yNmw9oeSn2YeTatWTPNzozzX8ZOeWPJlJVRJnrOoxUtJtmLEUmqoartH7BEEBAFBQBCoJggIASu/hUqkUokC2rZkwSSCBU12wpadhNXbpAk13vwwKlJ3O/L1QmYrxPNlDxuGyVtyIn6K8KSZHwY3XsRX + W0L0VyTEPjwM6KuFxN1uiB6Vkv48MpdjxLt9ieieQvscuvWE13eh2jnQ9zv + F2aICAICAKCQGEIRH22559H5IqnDTMGeU/SgUJ7WNLjOVH9g8/Xrv2Fa4P9SM6K7y4t + WXRw76sfVc42fPV936iJ5 + LKrbqTU0P3rA + 0dZbEh20L9HJHYj23I2oVrHFT5U5NFnY4m6svUA0Pvo8efbvjCBqtr0nN + IVot4Dkvv1v5aoy/HJcpUpsfI3olffdknV0uWuJfv9kWjkw55VIFAfM073PE4EkqZbEBf9HMTs8C6e3KhHiPbdqzJnKWMLAoJAeSMgHrDyRrj0 + rOEGvVoYY 9Y0inIeE + YQQ + cqGGj3dgDtvJjC/mKm7BHmG68lGjO + 0T

有人知道怎么修这个东西吗?

The*_*iot 58

试试这个:

var c=document.getElementById("alpha");
var d=c.toDataURL("image/png");
var w=window.open('about:blank','image from canvas');
w.document.write("<img src='"+d+"' alt='from canvas'/>");
Run Code Online (Sandbox Code Playgroud)

这将在新页面上显示画布中的图像,但如果您已将其open popup in new tab设置为about:blank在地址栏中显示.

编辑: - 虽然window.open("<img src='"+ c.toDataURL('image/png') +"'/>")在FF或Chrome中不起作用,但以下作品虽然渲染与画布上显示的有些不同,但我认为透明度是个问题:

window.open(c.toDataURL('image/png'));
Run Code Online (Sandbox Code Playgroud)

  • 我将其更改为:var w = window.open('about:blank');,现在图像在新窗口中打开,但是如何获取它以便保存关闭框,我不知道想要右键单击图像并点击另存为... (4认同)

Mau*_*ice 28

FileSaver.js应该能够在这里帮助你.

var canvas = document.getElementById("my-canvas");
// draw to canvas...
canvas.toBlob(function(blob) {
    saveAs(blob, "pretty image.png");
});
Run Code Online (Sandbox Code Playgroud)

  • 在IE9中有很多不起作用:-(有点可以用polyfills修复,但我担心这超出了这个范围.如果你可以为使用IE的用户建议使用谷歌Chrome Frame. (13认同)

noo*_*ntz 20

为了满足所有三点:

  • 按钮
  • 将图像保存为 png 文件
  • 打开保存、打开、关闭对话框

文件对话框是浏览器中的一个设置。

对于按钮/保存部分,将从其他答案归结为以下功能分配给您的按钮 onclick:

function DownloadCanvasAsImage(){
    let downloadLink = document.createElement('a');
    downloadLink.setAttribute('download', 'CanvasAsImage.png');
    let canvas = document.getElementById('myCanvas');
    let dataURL = canvas.toDataURL('image/png');
    let url = dataURL.replace(/^data:image\/png/,'data:application/octet-stream');
    downloadLink.setAttribute('href', url);
    downloadLink.click();
}
Run Code Online (Sandbox Code Playgroud)

Codepen 上的示例

另一种更简洁的方法是使用Canvas.toBlob()

function DownloadCanvasAsImage(){
    let downloadLink = document.createElement('a');
    downloadLink.setAttribute('download', 'CanvasAsImage.png');
    let canvas = document.getElementById('myCanvas');
    canvas.toBlob(function(blob) {
      let url = URL.createObjectURL(blob);
      downloadLink.setAttribute('href', url);
      downloadLink.click();
    });
}
Run Code Online (Sandbox Code Playgroud)

Codepen 上的示例

这两种解决方案都不是 100% 跨浏览器兼容的,因此请检查客户端


Tov*_*ask 15

我用这个解决方案来设置文件名:

HTML:

<a href="#" id="downloader" onclick="download()" download="image.png">Download!</a>
<canvas id="canvas"></canvas>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

function download(){
    document.getElementById("downloader").download = "image.png";
    document.getElementById("downloader").href = document.getElementById("canvas").toDataURL("image/png").replace(/^data:image\/[^;]/, 'data:application/octet-stream');
}
Run Code Online (Sandbox Code Playgroud)


小智 9

我遇到了这个问题,这是没有任何外部或附加脚本库的最佳解决方案:在Javascript标签或文件中创建此函数:我们假设画布是您的画布:

function download(){
        var download = document.getElementById("download");
        var image = document.getElementById("canvas").toDataURL("image/png")
                    .replace("image/png", "image/octet-stream");
        download.setAttribute("href", image);

    }
Run Code Online (Sandbox Code Playgroud)

在HTML的正文部分中指定按钮:

<a id="download" download="image.png"><button type="button" onClick="download()">Download</button></a>
Run Code Online (Sandbox Code Playgroud)

这是工作和下载链接看起来像一个按钮.在Firefox和Chrome中测试过.


Bil*_*son 6

我可能发现了一种更好的方法来不强迫用户右键单击并“将图像另存为”。将画布 base64 代码实时绘制到href链接中并进行修改,以便自动开始下载。我不知道它是否普遍兼容浏览器,但它应该适用于主要/新浏览器

var canvas = document.getElementById('your-canvas');
    if (canvas.getContext) {
        var C = canvas.getContext('2d');
    }

$('#your-canvas').mousedown(function(event) {
    // feel free to choose your event ;) 

    // just for example
    // var OFFSET = $(this).offset();
    // var x = event.pageX - OFFSET.left;
    // var y = event.pageY - OFFSET.top;

    // standard data to url
    var imgdata = canvas.toDataURL('image/png');
    // modify the dataUrl so the browser starts downloading it instead of just showing it
    var newdata = imgdata.replace(/^data:image\/png/,'data:application/octet-stream');
    // give the link the values it needs
    $('a.linkwithnewattr').attr('download','your_pic_name.png').attr('href',newdata);

});
Run Code Online (Sandbox Code Playgroud)

你可以环绕<a>任何你想要的东西。