如何使用canvas.toDataURL()将画布保存为图像?

War*_*ffe 125 javascript html5 canvas save cordova

我目前正在构建一个HTML5网络应用程序/ Phonegap本机应用程序,我似乎无法弄清楚如何将我的画布保存为图像canvas.toDataURL().有人可以帮帮我吗?

这是代码,它有什么问题?

//我的画布名为"canvasSignature"

JavaScript的:


function putImage()
{
  var canvas1 = document.getElementById("canvasSignature");        
  if (canvas1.getContext) {
     var ctx = canvas1.getContext("2d");                
     var myImage = canvas1.toDataURL("image/png");      
  }
  var imageElement = document.getElementById("MyPix");  
  imageElement.src = myImage;                           

}  
Run Code Online (Sandbox Code Playgroud)

HTML5:


<div id="createPNGButton">
    <button onclick="putImage()">Save as Image</button>        
</div>
Run Code Online (Sandbox Code Playgroud)

use*_*941 108

这是一些代码.没有任何错误.

var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");  // here is the most important part because if you dont replace you will get a DOM 18 exception.


window.location.href=image; // it will save locally
Run Code Online (Sandbox Code Playgroud)

  • 工作良好.如何更改下载文件的名称?它只是"下载"而没有扩展.谢谢! (38认同)
  • 不在本地保存,只需在新标签页中打开...`window.location.href` ... (4认同)
  • IE9 标准模式除外:“此网页上的某些内容或文件需要您尚未安装的程序。” Internet Explorer 8 及更高版本仅支持 CSS、&lt;link&gt; 和 &lt;img&gt; 中图像的数据 URI:https://developer.mozilla.org/en-US/docs/data_URIs (2认同)
  • 在 Chrome 中,这会导致浏览器崩溃。如果我在图像标签中显示图像,它确实有效,但右键单击菜单是灰色的 - 所以我仍然无法保存图像。 (2认同)
  • 在 chrome 76/windows7 下不起作用。它定位到“about:blank#blocked”。 (2认同)

Tho*_*s W 27

此解决方案允许您更改下载文件的名称:

HTML:

<a id="link"></a>
Run Code Online (Sandbox Code Playgroud)

JAVASCRIPT:

  var link = document.getElementById('link');
  link.setAttribute('download', 'MintyPaper.png');
  link.setAttribute('href', canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"));
  link.click();
Run Code Online (Sandbox Code Playgroud)

  • 无需更换。 (3认同)
  • 谢谢你,这对我帮助很大! (2认同)

SCo*_*vin 22

您可以使用canvas2image来提示下载.

我有同样的问题,这是一个简单的例子,它将图像添加到页面并强制浏览器下载它:

<html>
    <head>
        <script src="http://hongru.github.io/proj/canvas2image/canvas2image.js"></script>
        <script>
            function draw(){
                var canvas = document.getElementById("thecanvas");
                var ctx = canvas.getContext("2d");
                ctx.fillStyle = "rgba(125, 46, 138, 0.5)";
                ctx.fillRect(25,25,100,100); 
                ctx.fillStyle = "rgba( 0, 146, 38, 0.5)";
                ctx.fillRect(58, 74, 125, 100);
            }

            function to_image(){
                var canvas = document.getElementById("thecanvas");
                document.getElementById("theimage").src = canvas.toDataURL();
                Canvas2Image.saveAsPNG(canvas);
            }
        </script>
    </head>
    <body onload="draw()">
        <canvas width=200 height=200 id="thecanvas"></canvas>
        <div><button onclick="to_image()">Draw to Image</button></div>
        <image id="theimage"></image>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 刚刚尝试过,它会在Chrome中保存一个没有名称或扩展名的文件. (2认同)
  • 您发布的链接已损坏 (2认同)

gil*_*lyb 7

我创建了一个小型库来执行此操作(以及其他一些方便的转换).它被称为reimg,它使用起来非常简单.

ReImg.fromCanvas(yourCanvasElement).toPng()


100*_*ugy 7

这项工作对我来说:(只有谷歌铬)

<html>
<head>
    <script>
            function draw(){
                var canvas = document.getElementById("thecanvas");
                var ctx = canvas.getContext("2d");
                ctx.fillStyle = "rgba(125, 46, 138, 0.5)";
                ctx.fillRect(25,25,100,100);
                ctx.fillStyle = "rgba( 0, 146, 38, 0.5)";
                ctx.fillRect(58, 74, 125, 100);
            }

            function downloadImage()
            {
                var canvas = document.getElementById("thecanvas");
                var image = canvas.toDataURL();

                var aLink = document.createElement('a');
                var evt = document.createEvent("HTMLEvents");
                evt.initEvent("click");
                aLink.download = 'image.png';
                aLink.href = image;
                aLink.dispatchEvent(evt);
            }
    </script>
</head>
<body onload="draw()">
    <canvas width=200 height=200 id="thecanvas"></canvas>
    <div><button onclick="downloadImage()">Download</button></div>
    <image id="theimage"></image>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)


Sje*_*iti 5

类似于1000Bugy的答案,但更简单,因为您不必动态定位并手动分配click事件(外加IE修复程序)。

如果将下载按钮设为锚,则可以在运行默认锚功能之前立即劫持它。因此,onAnchorClick您可以将anchor href设置为canvas base64图像,并将anchal download属性设置为您要命名图像的名称。

这在(当前)IE中不起作用,因为它没有实现download属性,并阻止了数据uri的下载。但这可以通过使用window.navigator.msSaveBlob来解决。

所以,你的锚单击事件处理程序将被作为跟随(其中anchorcanvasfileName有范围查找):

function onClickAnchor(e) {
  if (window.navigator.msSaveBlob) {
    window.navigator.msSaveBlob(canvas.msToBlob(), fileName);
    e.preventDefault();
  } else {
    anchor.setAttribute('download', fileName);
    anchor.setAttribute('href', canvas.toDataURL());
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴


bma*_*ovu 5

您可以尝试一下;创建一个虚拟HTML锚,然后从那里下载图片,例如...

// Convert canvas to image
document.getElementById('btn-download').addEventListener("click", function(e) {
    var canvas = document.querySelector('#my-canvas');

    var dataURL = canvas.toDataURL("image/jpeg", 1.0);

    downloadImage(dataURL, 'my-canvas.jpeg');
});

// Save | Download image
function downloadImage(data, filename = 'untitled.jpeg') {
    var a = document.createElement('a');
    a.href = data;
    a.download = filename;
    document.body.appendChild(a);
    a.click();
}
Run Code Online (Sandbox Code Playgroud)

这是小提琴

  • 我喜欢这样一个事实:一切都是用 JS 完成的,包括链接元素的创建。它非常适合自动化目的 (3认同)
  • 无需追加Child。 (3认同)
  • 完美解决方案 (2认同)

Hak*_*rce 1

而不是imageElement.src = myImage;你应该使用window.location = myImage;

即使之后浏览器也会显示图像本身。您可以右键单击并使用“保存链接”来下载图像。

检查此链接以获取更多信息。