2013-10-23 78 views
0

我有幾層KineticJS畫布,它們都在彼此之上。我希望能夠將這些導出爲PNG格式。我可以使用.toDataURL()函數導出每個圖層,但我希望將它們全部作爲一個圖像。合併base64圖像

有沒有辦法合併所有的base64字符串?

+0

它會更容易將所有圖層繪製到一個單一的畫布上。 'drawImage(img,x,y)'可以將一個畫布元素作爲其第一個參數。只需將每個畫布(通過'drawImage')繪製到新的主畫布上,然後在該主畫布上調用'.toDataURL()'。 – apsillers

+0

試試這個,https://jsfiddle.net/1hcrvc16/3/ –

回答

3

@apsillers有正確的想法 - 在彼此頂部結合每個圖像並導出最終複合。

KineticJS具有快捷方式導出所有層合併:stage.toDataURL().

stage.toDataURL將其所有層的組合導出到dataUrl。

警告:與所有畫布圖像導出一樣,您必須確保所有圖像均符合CORS。

這裏的示例代碼:

var stage = new Kinetic.Stage({ 
    container: 'container', 
    width: 400, 
    height: 400 
}); 
var layer1 = new Kinetic.Layer(); 
stage.add(layer1); 
var layer2 = new Kinetic.Layer(); 
stage.add(layer2); 


var img1=new Image(); 
img1.onload = function() { 
    var image1 = new Kinetic.Image({ 
     x: 0, 
     y: 0, 
     image: img1, 
     width: 100, 
     height: 100 
    }); 
    layer1.add(image1); 
    layer1.draw(); 
} 
img1.src="yourCORScompliantImage1.png"; 

var img2=new Image(); 
img2.onload = function() { 
    var image2 = new Kinetic.Image({ 
     x: 0, 
     y: 0, 
     image: img2, 
     width: 100, 
     height: 100 
    }); 
    layer2.add(image2); 
    layer2.draw(); 
} 
img2.src="yourCORScompliantImage2.png"; 

$("#export").click(function(){ 
     stage.toDataURL({ 
      callback: function(dataUrl) { 
       window.open(dataUrl); 
      } 
     }); 
}); 
+0

找不到關於CORS圖片的很多信息。這隻在圖像在畫布內使用時才需要?我實際上沒有在畫布中使用任何內容,所以我沒事吧?另外,如果base64字符串太長,可能無法用作URL?我應該'var image = window.open(); image.document.write('');'。這兩個選項現在工作正常,只是擔心大字符串。非常感謝您的幫助。 –

+1

如果所有畫布內容都是在沒有圖像的情況下創建的,則不存在潛在問題。但如果您想了解更多關於CORS和圖像的信息,請參閱「跨域安全性」。乾杯! – markE

1

可以使含

<image width="100" height="100" xlink:href="data:image1/png;base64,..."> 
<image width="100" height="100" xlink:href="data:image2/png;base64,..."> 
<image width="100" height="100" xlink:href="data:image3/png;base64,..."> 
<image width="100" height="100" xlink:href="data:image4/png;base64,..."> 

SVG將是4層SVG

+0

試試這個,https://jsfiddle.net/1hcrvc16/3/ –