2017-07-26 111 views
0

我試圖構建許多konvajs畫布並將它們轉換爲konva圖像。 最後將這些圖像加載到另一個畫布並顯示。Conver konvajs畫布將圖像加載到另一個畫布

function main(){ 
    var total_konva_stage= createStage(); 
    var imagesLayer= new Konva.Layer(); 
    for (var key in array){ 
     $(".tmpcontainer").remove(); 
     containerName = containerNameBase + key; 
     $("#hidden_div").append("<div id='"+containerName+"' class='tmpcontainer'></div>"); 

     var konva_stage =createcanvas(containerName); //create a hidden dynamic div and bind this stage to it 
     var img = konva_stage .toDataURL("image/png"); 
     var imageObj = new Image(); 
     imageObj.src = img 
     imageObj.onload = function() { 
      callback_canvastoImg(imagesLayer, imageObj); 
     }; 
    } 
    total_konva_stage.add(imagesLayer); 
    total_konva_stage.show(); 
    total_konva_stage.draw(); 
} 
function callback_canvastoImg(imagesLayer, imageObj){ 
     var konva_image = new Konva.Image({imageObj}); 
     imagesLayer.add(konva_image); 
} 

我認爲我的結果是,「total_konva_stage」將每獨立IMG從konva_stage。

但是我發現我的第二個IMG將包含第一IMG,我的第三IMG包含第一,第二IMG

我現在不知道,請大家幫忙。 謝謝

+0

傑伊 - 這是工作的代碼?看起來你太過分了,因爲它是可行的。你能否檢討它,並理想地製作一個工作片斷,說明這個問題?在這篇文章中看到我的回答https://stackoverflow.com/questions/44591179/knovajs-html5-canvas-rotation-origin如何提供一個在stackoverflow中使用konvajs的片段。 –

回答

0

onload函數回調是異步的。這意味着它只會在處理整個數組後才被執行。

所以在這一行:callback_canvastoImg(imagesLayer, imageObj);可變imageObj將引用最後創建的圖像。

爲了避免這種情況,您可以:聲明變量(如果你應該使用類似babel

const imageObj = new Image(); 
  • 您可以定義閉合功能的循環迭代的

    1. 運用現代JS語法。你只需要使用array.forEach,而不是爲循環:

      array.forEach(function(item, key) { 
          $(".tmpcontainer").remove(); 
          containerName = containerNameBase + key; 
          $("#hidden_div").append("<div id='"+containerName+"' class='tmpcontainer'></div>"); 
      
          var konva_stage =createcanvas(containerName); //create a hidden dynamic div and bind this stage to it 
          var img = konva_stage .toDataURL("image/png"); 
          var imageObj = new Image(); 
          imageObj.src = img 
          imageObj.onload = function() { 
          callback_canvastoImg(imagesLayer, imageObj); 
          }; 
      } 
      
  • +0

    謝謝lavrton,我發現我的根本原因是轉換前圖像不完整。我測試了以下步驟。 ' 1.將圖像加載到konva.stage 2.鼠標穿過屏幕中的所有konva.stage。 (圖像將真正加載) 3.單擊一個按鈕將這些konva.stage轉換爲img並加載到其他可見的konva.stage ' – Jay