【问题标题】:html2canvas saving as a jpeg without opening in browserhtml2canvas 保存为 jpeg 而无需在浏览器中打开
【发布时间】:2013-05-02 00:09:59
【问题描述】:

我正在尝试创建一个屏幕抓取按钮,用于创建用户 document.body 的图像。

理想情况下,用户可以选择将图像在本地保存为.jpeg

我正在接近使用html2canvas 库创建我需要的功能。

function screenGrabber() {
    html2canvas([document.body], {
    logging: true,
    useCORS: true,
    onrendered: function (canvas) {            

        img = canvas.toDataURL("image/jpg");

        console.log(img.length);
        console.log(img);

        window.location.href=img; // it will save locally
    }
});

}

为了验证这是否有效,我一直在新的浏览器窗口中打开 img 变量。图像没有完全渲染,我猜这是因为它的长度超过 30,000 个字符。

onrendered 事件之后,如何更好地为用户提供在本地保存画布的选项?

【问题讨论】:

    标签: javascript jquery html html2canvas


    【解决方案1】:

    一个下载器功能使它更容易:

    function download(strData, strFileName, strMimeType) {
        var D = document,
            A = arguments,
            a = D.createElement("a"),
            d = A[0],
            n = A[1],
            t = A[2] || "text/plain";
    
        //build download link:
        a.href = "data:" + strMimeType + "," + escape(strData);
    
    
        if (window.MSBlobBuilder) {
            var bb = new MSBlobBuilder();
            bb.append(strData);
            return navigator.msSaveBlob(bb, strFileName);
        } /* end if(window.MSBlobBuilder) */
    
    
    
        if ('download' in a) {
            a.setAttribute("download", n);
            a.innerHTML = "downloading...";
            D.body.appendChild(a);
            setTimeout(function() {
                var e = D.createEvent("MouseEvents");
                e.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                a.dispatchEvent(e);
                D.body.removeChild(a);
            }, 66);
            return true;
        } /* end if('download' in a) */
        ; //end if a[download]?
    
        //do iframe dataURL download:
        var f = D.createElement("iframe");
        D.body.appendChild(f);
        f.src = "data:" + (A[2] ? A[2] : "application/octet-stream") + (window.btoa ? ";base64" : "") + "," + (window.btoa ? window.btoa : escape)(strData);
        setTimeout(function() {
            D.body.removeChild(f);
        }, 333);
        return true;
    } /* end download() */
    
    
    
    
    
    function screenGrabber() {
        html2canvas([document.body], {
        logging: true,
        useCORS: true,
        onrendered: function (canvas) {            
    
            img = canvas.toDataURL("image/jpeg");
    
           download(img, "modified.jpg", "image/jpeg");
        }
    });
    
    }
    

    【讨论】:

    • 嘿丹达维斯。你能发布一个这个例子的jsfiddle吗?
    • 很好的例子,尽管没有经过测试,但理论上看起来很实用。 +1
    • 我认为MSBlobBuilder 仅适用于 IE,是否有任何跨平台方法可以做到这一点?
    • @SviatoslavZalishchuk:跨平台的方式做什么? (MSBlobBuilder 仅被 IE9+10 使用),但它只是所使用的兼容堆栈的一小部分。更新请参考github.com/rndme/download
    • @dandavis 谢谢,我会试试看。
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2023-03-04
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多