HTML2Canvas将2个捕获的画布合并为一个

时间:2014-10-16 11:04:59

标签: javascript jquery html canvas html2canvas

使用HTML2Canvas我正在尝试捕获googleMap(其工作正常)然后捕获一个位于其顶部的#overlay div(这是允许人们放置图像的在特定地方的googleMap上)(工作正常)。

然后页面会在页面上显示这两个canvas元素,然后我们想要另一个捕获,将两个画布组合成一个图像然后可以下载

到目前为止我遇到的问题是,当我尝试捕获canvas div时,似乎HTML2Canvas没有拾取它创建的#preview元素。

HTML:

<div id="mainPanel">
    <div id="overlay">

    </div>
    <button class="download">Download as PDF</button>
    <button onclick="startEdit();" class="edit_button">Start Editing</button>
    <div id="map">
        <input id="pac-input" class="controls" type="text" placeholder="Search Box">
        <div id="map-canvas"></div>
    </div>
    <div id="preview">

    </div>
</div>

HTML2Canvas JQuery:

$(".download").click(function() {
        html2canvas($("#map"), {
            logging: true,
            proxy: "https://html2canvas.appspot.com/query",
            onrendered: function(canvas) {
                // var img = canvas.toDataURL("image/png");
                $(canvas).css({"position" : "absolute", "z-index" : "999"});
                document.getElementById("preview").appendChild(canvas);

                html2canvas($("#overlay"), {
                    logging: true,
                    onrendered: function(canvas1) {

                        // var img = canvas.toDataURL("image/png");
                        $(canvas1).css({"position" : "absolute", "z-index" : "1000"});
                        document.getElementById("preview").appendChild(canvas1);

                        setTimeout(function() {downloadURI()}, 5000);
                    }
                });
            }
        });
});

function downloadURI() {
    html2canvas($("#preview"), {
        logging: true,
        onrendered: function(canvas2) {

            var img = canvas2.toDataURL("image/png");
                window.open(img);
                // var link = document.createElement("a");
                // link.download = "image-download.png";
                // link.href = img;
                // link.click();
            }
        });
    }

正如您所看到的,我已经尝试延迟DownloadURI功能,以防画布未及时加载,但这不是问题。我不确定canvas元素是否与插件不兼容。

如何工作:我的上述代码相当简单。当一个HTML2Canvas完成时,它运行另一个HTML2Canvas。这两个画布都附加在#preview元素上,这样我就可以捕获该元素,其中2个画布位于其中。一旦完成它就会运行另一个函数来捕获{<1}}元素,我希望将这两个图像一个接一个地组合成一个用户可以下载的单个图像,但它只是带回一个空图像。

如果需要更多信息,请告诉我,谢谢。

1 个答案:

答案 0 :(得分:2)

此函数接受两个参数topbottom。两者都应该是ImageData对象,您可以通过ctx.getImageData()获取它们。返回底部ImageData,并将顶部数据合并到它。此函数使用Porter-Duff方法合并颜色。

function mergeData(top, bottom){
    var tD = top.data,
        bD = bottom.data,
        l = tD.length;
    for(var i = 0; i < l; i += 4){
        //source alpha
        var alphaSrc = tD[i+3] / 255, //source alpha
            alphaDst = bD[i+3] / 255, //destination alpha
            alphaSrcO = 1 - alphaSrc, //(1 - x)
            alpha = alphaSrc + alphaDst * alphaSrcO; //if destination alpha is opaque
        //merge colors
        bD[i] = ((tD[i]*alphaSrc) + (bD[i]*alphaDst*alphaSrcO)) / alpha,
        bD[i+1] = ((tD[i+1]*alphaSrc) + (bD[i+1]*alphaDst*alphaSrcO)) / alpha,
        bD[i+2] = ((tD[i+2]*alphaSrc) + (bD[i+2]*alphaDst*alphaSrcO)) / alpha,
        bD[i+3] = 255*alpha;
    }
    //return bottom
    return bottom;
}

要使用此功能及其返回的数据,请执行以下操作:

var merged = mergeData(ctx1.getImageData(), ctx2.getImageData());
ctx2.putImageData(merged, 0, 0);

显然,如果需要,您可以将结果数据放入第三个隐藏的上下文中。