【问题标题】:Downloading Canvas element to an image将 Canvas 元素下载到图像
【发布时间】:2011-12-28 22:09:45
【问题描述】:

保存画布对象有哪些不同的方法?

在我的研究中,我发现了两种方法:

var data = canvas.toDataURL();
var prev = window.location.href;
window.location.href = data.replace("image/png", "image/octet-stream");
window.location.href = prev;

另一种方法是拍摄快照。

还有其他方法吗?

是否可以自定义下载文件名?

【问题讨论】:

    标签: javascript canvas download


    【解决方案1】:

    需要NO BUTTON的解决方案:

    var download = function(){
      var link = document.createElement('a');
      link.download = 'filename.png';
      link.href = document.getElementById('canvas').toDataURL()
      link.click();
    }
    

    如果您有其他要下载的触发器或您无法轻松引用的触发器,这很有用。

    【讨论】:

    • @TAHASULTANTEMURI 你能更具体一点吗?如果您找到了解决方法,请分享。
    • 检查答案,实际上由于安全原因 toDataURL 不再有效,但如果您从从 img 标签导入的画布下载图像,则此标签应具有 crossorigin 属性以使其工作见@ 987654321@
    • @TAHASULTANTEMURI 谢谢!您能否检查实施建议的答案 (img.setAttribute('crossOrigin', 'anonymous'); img.src = url) 是否有效?
    【解决方案2】:

    保存的一种方法是导出为图像...您已经找到了这个解决方案,它是我认为最好的解决方案;)

        var canvas = document.getElementById("mycanvas");
        var img    = canvas.toDataURL("image/png");
        document.write('<img src="'+img+'"/>');
    

    您可以使用不同的图像类型。更改此函数中的 mimetype:

        canvas.toDataURL("image/jpeg");
    

    另一种保存画布数据(保存到 PDF)的方法是使用 wkhtmltopdf Library

    干杯。弗兰克

    frankneff.ch / @frankneff

    【讨论】:

    • 我做document.write的时候,不就是写到网页上吗?还是会发出下载命令?
    • 是的,它只是将图像写入页面。你可以强制下载,但在这种情况下,你需要一个服务器端实现explained here,或者谷歌“强制图片下载”
    • 要下载图像,您可以使用download 属性 (html5) 将其放置在&lt;a&gt; 标记中:&lt;a href="javascript:canvas.toDataURL('image/jpeg');" download="download" &gt;Download as jpeg&lt;/a&gt;
    【解决方案3】:

    这个方案比较好:

    function download() {
    var download = document.getElementById("download");
    var image = document.getElementById("myCanvas").toDataURL("image/png")
        .replace("image/png", "image/octet-stream");
    download.setAttribute("href", image);
    //download.setAttribute("download","archive.png");
    }
    <a id="download" download="triangle.png">
    <button type="button" onClick="download()">Download</button>
    </a>
        
    <canvas id="myCanvas" width="720" height="450">Your browser does not support Canvas.</canvas>

    【讨论】:

    • 你能解释一下为什么这样更好吗?
    • 是的,为什么?对不起,我不能编辑它!队列已满
    【解决方案4】:
    var c = document.getElementById("popup");
    var link = document.getElementById('cropImageLink');
    link.setAttribute('download', 'MintyPaper.png');
    link.setAttribute('href', c.toDataURL("image/png").replace("image/png", "image/octet-stream"));
    link.click();
    

    我希望这些代码能够正常工作。但首先在 id 为“cropImageLink”的画布标签中创建锚标签。比检查后。但它在IE浏览器中不起作用

    【讨论】:

      【解决方案5】:

      试试这样的...

      function downloadCanvasAsImage(){
      
          let canvasImage = document.getElementById('canvas').toDataURL('image/png');
          
          // this can be used to download any image from webpage to local disk
          let xhr = new XMLHttpRequest();
          xhr.responseType = 'blob';
          xhr.onload = function () {
              let a = document.createElement('a');
              a.href = window.URL.createObjectURL(xhr.response);
              a.download = 'image_name.png';
              a.style.display = 'none';
              document.body.appendChild(a);
              a.click();
              a.remove();
            };
            xhr.open('GET', canvasImage); // This is to download the canvas Image
            xhr.send();
      }
      

      【讨论】:

      • 如果我们想把它转换成 SVG 怎么办?请指导。
      【解决方案6】:

      您可以使用reimg 库非常轻松地做到这一点。

      将画布转换为 img : ReImg.fromCanvas(document.getElementById('yourCanvas')).toPng()

      可以像这样为用户下载这张图片: ReImg.fromCanvas(document.getElementById('canvas')).downloadPng()

      关于给文件一个自定义名称,如果您查看库的代码(它非常简短且易于理解),您会发现您可以更改名称。

      这里是特定行的链接:https://github.com/gillyb/reimg/blob/master/reimg.js#L63 filename = filename || 'image.png';

      【讨论】:

        【解决方案7】:

        this 相关,感谢@kaiido

        我刚刚修改了回调方法,它起作用了,上面提到的回调方法对我不起作用

        var callback = function(blob) {
        var a = document.createElement('a');
        var saveAs = $('input[name="group1"]:checked').val();
        
        
        var link = document.createElement('a');
        link.href = URL.createObjectURL(blob);
        link.download = 'Image.' + saveAs;
        document.body.appendChild(link);
        link.click();
        
        };
         function dataURIToBlob(dataURI, callback) {
        var binStr = atob(dataURI.split(',')[1]),
        len = binStr.length,
        arr = new Uint8Array(len);
        
         for (var i = 0; i < len; i++) {
          arr[i] = binStr.charCodeAt(i);
         }
        
           callback(new Blob([arr]));
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-08
          • 1970-01-01
          • 2016-09-18
          • 2016-07-24
          相关资源
          最近更新 更多