2017-05-29 7 views
0

ファブリックjsでは、特定のキャンバスとそのオブジェクトをダウンロードできます。しかし、別のキャンバスの上にキャンバスが1つあれば、キャンバスの上に置くので、キャプチャしません。position:absolute;(css)ので、すべてのキャンバスがダウンロードされていません。これを行う別の方法がありますか?ファブリックjsの別のキャンバスの後ろにキャンバスをキャプチャしないダウンロード

マイHTMLコーディングは、私は上記のコードを参照して、私を返信..

してくださいコードの下に

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); 

を使用し、ダウンロードするために

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(); 
    } 
} 

<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がコーディングされています

答えて

1

あなたは(わずか2つのキャンバスをマージする方法グーグル)一つにこれらの2画像データをマージ

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; 
} 
:2キャンバス

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からコンテキストおよび画像データを取得する:1.

ステップ1にmbine 2キャンバス

ステップ3:新しいキャンバスを作成し、そこに置かは(jQueryを使ってなど)のデータをマージし

$('<canvas>').attr({ 
       id: 'mergedCanvas', 
       width: 400, 
       height: 300 
      }).appendTo('body'); 

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

セントep 4:結合されたキャンバスデータから取り出して保存するtoDataUrl();

ステップ5:マージされたキャンバスを削除する

関連する問題