如何使用 javascript/jquery 将 3 个画布 HTML 元素组合成 1 个图像文件?

Mru*_*tra 2 javascript jquery canvas html5-canvas html2canvas

我有 3 个画布,即 canvasTarget、canvasTarget2、canvasTarget3,如下所示:

        var canvas = document.getElementById("canvasTarget");
        var img = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
        var canvas2 = document.getElementById("canvasTarget2");
        var img2 = canvas2.toDataURL("image/png").replace("image/png", "image/octet-stream");
        var canvas3 = document.getElementById("canvasTarget3");
        var img3 = canvas3.toDataURL("image/png").replace("image/png", "image/octet-stream");
Run Code Online (Sandbox Code Playgroud)

我想将这些画布元素合二为一并下载为 JPEG 或 PDF 文件。我正在使用 /html2canvas.js 下载这个。任何立即回应将不胜感激。

Bri*_*ock 5

所以你已经渲染了你的画布,但不清楚你想如何组合它们 - 重叠,并排?无论哪种情况,您都可以使用Canvas.context.drawImage()将它们添加到新的画布对象,然后使用该Canvas.toDataURL()方法返回新画布的、erm、dataURL。

大概是这样的……

/* assumes each canvas has the same dimensions */
var overlayCanvases = function(cnv1, cnv2, cnv3) {
    var newCanvas = document.createElement('canvas'),
        ctx = newCanvas.getContext('2d'),
        width = cnv1.width,
        height = cnv1.height;

    newCanvas.width = width;
    newCanvas.height = height;

    [cnv1, cnv2, cnv3].forEach(function(n) {
        ctx.beginPath();
        ctx.drawImage(n, 0, 0, width, height);
    });

    return newCanvas.toDataURL();
};

/* assumes each canvas has the same width */
var verticalCanvases = function(cnv1, cnv2, cnv3) {
    var newCanvas = document.createElement('canvas'),
        ctx = newCanvas.getContext('2d'),
        width = cnv1.width,
        height = cnv1.height + cnv2.height + cnv3.height;

    newCanvas.width = width;
    newCanvas.height = height;

    [{
        cnv: cnv1,
        y: 0
    },
    {
        cnv: cnv2,
        y: cnv1.height
    },
    {
        cnv: cnv3,
        y: cnv1.height + cnv2.height
    }].forEach(function(n) {
        ctx.beginPath();
        ctx.drawImage(n.cnv, 0, n.y, width, n.cnv.height);
    });

    return newCanvas.toDataURL();
};

/* USAGE */
var dURL1 = overlayCanvases(canvas1,canvas2,canvas3);
var dURL2 = verticalCanvases(canvas1,canvas2,canvas3);
Run Code Online (Sandbox Code Playgroud)

该overlayCanvases()函数会将画布放在彼此的顶部,因此参数的顺序很重要。在verticalCanvases()将垂直和降序排列在画布上。这里要注意的重要一点是,它Canvas.context.drawImage()允许您将一个画布绘制到另一个画布上 - 可以根据您的目的调整相对位置。

Fiddled 上面的函数:https ://jsfiddle.net/BnPck/cyLrmpjy/