js实现canvas保存图片为png格式并下载到本地

有个需求说要把网站上的图表可以保存到本地,查看了一下表单的元素,是canvas内的。
用了好多种方法,都失败了。最后搜到了stackoverflow上的一种方法成功导出,代码贴在下面

function exportCanvasAsPNG(id, fileName) {

    var canvasElement = document.getElementById(id);

    var MIME_TYPE = "image/png";

    var imgURL = canvasElement.toDataURL(MIME_TYPE);

    var dlLink = document.createElement('a');
    dlLink.download = fileName;
    dlLink.href = imgURL;
    dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');

    document.body.appendChild(dlLink);
    dlLink.click();
    document.body.removeChild(dlLink);
}

原帖:https://stackoverflow.com/questions/923885/capture-html-canvas-as-gif-jpg-png-pdf

第一次写js,踩了几个坑,以下注意事项
这种写法是有误的,语法有错,函数内的参数应用单引号括起来,因为双引号内有引号应该使用单引号

<button onclick="exportCanvasAsPNG("pieChart")">保存</button>

正确写法

<button onclick="exportCanvasAsPNG('pieChart','nianling')">保存</button>

再贴几个无效的方法以作参考
第一种方法

var canvas = document.getElementById("pieChart");
var ctx = canvas.getContext('2d');
var btn = document.getElementById('btn1');
btn.onclick() = function() {
    var type = 'png';
    download(type);
}
function download(type) {
    var imgdate = canvas.toDataURL(type);
    var fixtype = function(type) {
        type = type.toLowerCase().replace(/jpg/i, 'jpeg');
        var r = type.match(/png|jpeg|bmp|gif/)[0];
        return 'image' +  r;
    }
    imgdata = imgdata.replace(fixtype(type), 'image/octet-stream')
    var saveFile = function (data, filename) {
        var link = document.createElement('a');
        link.href = data;
        link.download = filename;
        var event = document.createElement('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        link.dispatchEvent(event);
    }
    var filename = new Date().toLocaleDateString() + '.' + type;
    saveFile(imgdate, filename);
}

第二种方法

var canvas = document.getElementById('pieChart');
function download() {
    var dom = document.createElement("a");
    dom.href = this.canvas.toDataURL("image/png");
    dom.download = new Date().getTime() + ".png";
    dom.click();
}

第三种方法

var canvas = document.getElementById('pieChart');
function base64Img2Blob(code){
    var parts = code.split(';base64,');
    var contentType = parts[0].split(':')[1];
    var raw = window.atob(parts[1]);
    var rawLength = raw.length;

    var uInt8Array = new Uint8Array(rawLength);

    for (var i = 0; i < rawLength; ++i) {
      uInt8Array[i] = raw.charCodeAt(i);
    }

    return new Blob([uInt8Array], {type: contentType});
}
function downloadFile(){

    var aLink = document.createElement('a');
    var blob = base64Img2Blob(canvas.toDataURL("image/png")); //new Blob([content]);

    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错
    aLink.download = new Date().getTime() + ".png";
    aLink.href = URL.createObjectURL(blob);

    aLink.dispatchEvent(evt);
}

第四种方法

window.onload = function() {
    var canvas = document.getElementById("pieChart");
    var context = canvas.getContext("2d");
    // no argument defaults to image/png; image/jpeg, etc also work on some
    // implementations -- image/png is the only one that must be supported per spec.
    window.location = canvas.toDataURL("image/png");
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容