2015-01-21 25 views
1

在我的網頁中有一個包含一些內容的畫布,並且此內容分別呈現(不使用fabric.js)。使用fabric.js修改畫布而不移除現有內容

我想要做的是使用fabric.js在現有內容之上添加一些內容。 我想這樣做如下(示例代碼),

var canvas = new fabric.Canvas('c'); 
var path = new fabric.Path('M 0 0 L 200 100 L 170 200 z'); 
path.set({ left: 120, top: 120 }); 
canvas.add(path); 

但它會刪除從畫布上現有的內容。

你能幫我解決嗎?

+0

哪裏有內容已經在上面的畫布?您發佈的代碼有效。我最好的猜測是你可以使用canvas.toDataURL()導出你的原始畫布來獲得一個可以用作新畫布背景的PNG。否則,您將不得不將自己的方法轉換爲將原始畫布轉換爲JSON。 – 2015-01-21 15:13:12

回答

4

使用canvas.toDataURL()函數由Jason的Maggard的建議:

var c = document.getElementById('c'); 
var ctx = c.getContext("2d"); 
ctx.fillStyle = "#FF0000"; 
ctx.fillRect(0,0,c.width,c.height); 

var bg = c.toDataURL("image/png"); 

var canvas = new fabric.Canvas('c'); 
canvas.setBackgroundImage(bg,canvas.renderAll.bind(canvas)); 
var path = new fabric.Path('M 0 0 L 200 100 L 170 200 z'); 
path.set({ left: 120, top: 120 }); 
canvas.add(path); 

紅色背景仍然應該有你添加fabricjs代碼後還是一樣。如果你想能夠將它移動到/ etc中,你也可以使用canvas.toDataURL()函數作爲動態圖像的src。

var c = document.getElementById('c'); 
var ctx = c.getContext("2d"); 
ctx.fillStyle = "#FF0000"; 
ctx.fillRect(0,0,c.width,c.height); 

var img = new Image(); 
img.src = c.toDataURL("image/png"); 

var canvas = new fabric.Canvas('c'); 
var oldCanvas = new fabric.Image(img,{ width: c.width, height: c.height }); 

var path = new fabric.Path('M 0 0 L 200 100 L 170 200 z'); 
path.set({ left: 120, top: 120 }); 

canvas.add(oldCanvas); 
canvas.add(path); 
+0

謝謝@Phoenix。 是的,我可以使用canvas.toDataURL()。 :) – TheStark 2015-01-28 04:32:15

+0

@Phoenix由於提取base64數據並在畫布上再次繪製數據而導致的性能影響如何?我有近30個畫布渲染,我需要初始化他們每個人的面料。這需要它自己的甜蜜時間,現在鎖定我的fps。有小費嗎 ? – Vinay 2017-06-19 14:39:26

+0

@Vinay我在這麼多的畫布上沒有嘗試過這樣的東西。然而,我已經在一個畫布上嘗試了大量的圖像,而且這個延遲並不美觀。我曾閱讀過一篇文章,遊戲開發人員通過將畫布複製到一半大小的畫布上然後按比例放大來減少移動設備的fps問題。根據您的需要(以及框架需要的清晰程度),您可以嘗試類似的方法來減少您需要處理的大量數據。可能還會有一些與畫布相關的瀏覽器設置,您可以查看。 – 2017-06-20 20:19:03