首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载不要在fabric js中捕获另一个画布后面的画布

下载不要在fabric js中捕获另一个画布后面的画布
EN

Stack Overflow用户
提问于 2017-05-29 13:53:38
回答 1查看 88关注 0票数 0

在Fabric js中,我们可以下载特定的画布及其对象。但是,如果我在另一个画布上有一个画布,那么它就不会捕获,因为我使用样式位置将它放置在另一个画布之上: (css),所以所有的画布都没有下载。还有别的办法吗。

我的html编码是

代码语言:javascript
复制
<div class="main_canvas">
    <canvas id="canvas_img" data-image="google-nexus-5x.png"></canvas>
    <div class="collage_wr">
    </div>
</div>
<a href="javascript:void(0);" class="save-image" id="save">Save</a>

我的js编码是

代码语言:javascript
复制
var main_canvas = new fabric.Canvas('canvas_img'),
    width = $('.main_canvas').width(),
    height = $('.main_canvas').height(), //580
    img = $('#canvas_img').attr('data-image'),
    name = "phone";
    main_canvas.setWidth(width);
    main_canvas.setHeight(height);
    main_canvas.controlsAboveOverlay = true;
    main_canvas.selection = false;
    main_canvas.lockUniScaling = true;
    main_canvas.centeredScaling =  true;
    fabric.Image.fromURL(img, function(oImg) {
        if ( $(window).width() < 800 ) {
            oImg.set({
                width: oImg.getWidth() / 1.4,
                height: oImg.getHeight() / 1.4,
            });
        } else {
            oImg.set({
                width: oImg.getWidth(),
                height: oImg.getHeight(),
            });
        }
    });
    main_canvas.setOverlayImage(img, main_canvas.renderAll.bind(main_canvas),{
        name: name,
        // width: width,
        // height: height,
        originX: 'left',
        originY: 'top'
    });
main_canvas.setBackgroundColor('#fff');
var XML = '<?xml version="1.0" encoding="utf-8"?>';
    XML += '<views>';
        XML += '<view>';
            XML += '<view_type>1</view_type>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas1</canvas_id>';
            XML += '</canvas>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas2</canvas_id>';
            XML += '</canvas>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas3</canvas_id>';
            XML += '</canvas>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas4</canvas_id>';
            XML += '</canvas>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas5</canvas_id>';
            XML += '</canvas>';
            XML += '<canvas>';
                XML += '<canvas_id>canvas6</canvas_id>';
            XML += '</canvas>';
        XML += '</view>';
    XML += '</views>';
XML += '</xml>';

var canvasArray = fabricCanvasArray = ctxArray = [];
var canvas = null;
var activeCanvas = activeObject = canvasStr = '';
var firstView = true;
$(XML).find('view').each(function() {
    var canvasXMLCnt = 0;
    var viewType = $(this).find('view_type').text();
    var divID = 'dynamicDiv_'+viewType;
    createDynamicDiv(divID);

    $(this).find('canvas').each(function() {
        canvasXMLCnt++;
        var canvasID = $(this).find('canvas_id').text();
        var variable_DynamicCanvas = 'canvas_'+viewType+'_'+canvasXMLCnt;
        var dynamicCanvas = document.createElement('canvas');
        dynamicCanvas.id = variable_DynamicCanvas;
        dynamicCanvas.className = ' dynamic-canvases';
        var createdDiv = document.getElementById(divID);
        createdDiv.appendChild(dynamicCanvas);
        canvasArray.push(variable_DynamicCanvas);
    });
});
function createDynamicDiv(divID) {
    if ($('#'+divID).length == 0) {
        var dynamicDiv = document.createElement('div');
        dynamicDiv.id = divID;
        dynamicDiv.className = 'col-md-12 canvas-div';
        // createAddIcon(divID, dynamicDiv);
        $('.collage_wr').append(dynamicDiv);
        if(firstView != false) {
            $("#"+divID).show();
        } else {
            $("#"+divID).hide();
        }
        firstView = false;
    }
}
if (typeof canvasArray !== 'undefined' && canvasArray.length > 0) {
    for (var i in canvasArray){
    var thisCanvasID = canvasArray[i];
    fabricCanvasArray[i] = new fabric.Canvas(canvasArray[i], {
        isDrawingMode : false,
        width : '90',
        height : '90',
        id : thisCanvasID
    });

    $('#' + thisCanvasID).parent().attr('id', ('div_' + thisCanvasID));
        $('#' + thisCanvasID).parent().addClass('collage_container');
        canvasStr += '#div_' + thisCanvasID;
        if (i < canvasArray.length - 1){
            canvasStr += ',';
        }
    }
    if (typeof fabricCanvasArray !== 'undefined' && fabricCanvasArray.length > 0) {
        canvasDivMouseUp();
    }
}

下载时,我使用了以下代码

代码语言:javascript
复制
document.getElementById('save').addEventListener('click', function() {
    // var canvas = getCanvas();
    main_canvas.deactivateAll().renderAll();

    downloadJpg(this, main_canvas, 'download.jpeg');    
    function downloadJpg(link,canvasId,filename) {
        var img = main_canvas.toDataURL({
            format: 'jpeg',
            quality: 0.8 
        });
        link.href = img;
        link.download=filename;
    }
},false);

请看上面的代码并回复我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 20:31:32

你必须把两个画布组合成一个。

步骤1:从两个画布中获取上下文和imageData

代码语言:javascript
复制
var canvas1Ctx = document.getElementById('canvas1').getContext('2d');
var canvas2Ctx = document.getElementById('canvas2').getContext('2d');
var canvas4Download1 = canvas1Ctx.getImageData(0, 0, 400,300);
var canvas4Download2 = canvas2Ctx.getImageData(0, 0, 400, 300);

步骤2:将这2 imageData合并为一个(只需谷歌如何在2张画布上涂鸦)

代码语言:javascript
复制
var merged = mergeData(canvas4Download1, canvas4Download2);

function mergeData(topCanvas, bottomCanvas){
    var topCanvasData = topCanvas.data,
        bottomCanvasData = bottomCanvas.data,
        l = topCanvasData.length;
    for(var i = 0; i < l; i += 4){
        //source alpha
        var alphaSource = topCanvasData[i+3] / 255, //source alpha
            alphaDestination = bottomCanvasData[i+3] / 255, //destination alpha
            alphaSourceO = 1 - alphaSource, //(1 - x)
            alpha = alphaSource + alphaDestination * alphaSourceO; //if destination alpha is opaque
        //merge colors
        bottomCanvasData[i] = ((topCanvasData[i]*alphaSource) + (bottomCanvasData[i]*alphaDestination*alphaSourceO)) / alpha,
        bottomCanvasData[i+1] = ((topCanvasData[i+1]*alphaSource) + (bottomCanvasData[i+1]*alphaDestination*alphaSourceO)) / alpha,
        bottomCanvasData[i+2] = ((topCanvasData[i+2]*alphaSource) + (bottomCanvasData[i+2]*alphaDestination*alphaSourceO)) / alpha,
        bottomCanvasData[i+3] = 255*alpha;
    }
    return bottomCanvas;
}

步骤3:创建新画布并将合并的数据放到那里(例如,使用jQuery)

代码语言:javascript
复制
$('<canvas>').attr({
                id: 'mergedCanvas',
                width: 400,
                height: 300
            }).appendTo('body');

            var canvas4download = $('#mergedCanvas').get(0).getContext('2d');
            canvas4download.putImageData(merged, 0, 0);

步骤4:从合并的画布数据中提取数据并使用toDataUrl();保存它

步骤5:删除合并的画布

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44244213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档