2010-07-22 40 views
2

我正在構建一個firefox插件,它允許用戶在對象上繪製任意圖形並將其保存爲圖像(png文件)。getDataURL部分畫布對象

var $ = getJQueryOb(); 
var canvas = '<canvas id="canvas" width="1024" height="1024" style="position:absolute; top:0px; left:0px;"></canvas>'; 
var currentWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser"); 
var mainDoc = currentWindow.getBrowser().contentDocument; 
var cObj = $(canvas).appendTo(mainDoc.body); 
$(cObj).bind('mousemove', handlePenDraw); 

使用這個我可以畫在畫布上。但是,當我保存圖像時,我不希望保存完整的畫布 - 而只是創建要保存的圖像周圍的「邊框矩形」。

有沒有什麼辦法可以實現這一點。什麼我目前做的是要拯救畫布,因爲它是:

var $ = getJQueryOb(); 
var canvas = $('#canvas')[0]; 
var dURL = canvas.toDataURL("image/png"); 
saveToFile(dURL, "image-file.png"); 

回答

6

你可以存儲所有已經在handlePenDraw方法被畫的左上方和右下方COORDS然後檢索已繪製的區域使用getImageData方法。

然後將您檢索到的imageData放到只與繪製區域一樣大的新畫布上,然後保存新畫布。

  • 編輯:我現在已經創建了一個演示,做以上,但它不保存新的帆布,但只是其附加到一個div - http://jsfiddle.net/SMh3N/12/

下面是一些粗糙的未經測試的代碼:

// Set these with these in your handlePenDraw method. 
var topLeftPoint, bottomRightPoint; 
var width = bottomRightPoint.x - topLeftPoint.x; 
var height = bottomRightPoint.y - topLeftPoint.y; 

// Retrieve the area of canvas drawn on. 
var imageData = context.getImageData(topLeftPoint.x, topLeftPoint.y, width, height); 

// Create a new canvas and put the retrieve image data on it 
var newCanvas = document.createElement("canvas"); 
newCanvas.width = width; 
newCanvas.height = height; 

newCanvas.getContext("2d").putImageData(imageData, 0, 0); 

// Now call save to file with your new canvas 
var dURL = newCanvas.toDataURL("image/png"); 
saveToFile(dURL, "image-file.png"); 
+0

哇!非常感謝! getImageData()是我一直在尋找的func! – Kapil 2010-07-23 08:59:47

+0

您的解決方案運行良好。不過,我有一個後續問題。我注意到putImageData()方法需要更長的時間才能將圖像添加到畫布。相反,有沒有從imageData本身提取dataURL的方法?這樣我就可以減少製作圖像所需的時間。有任何想法嗎?如果允許,我會很好地構建base64字符串。 – Kapil 2010-07-23 12:59:32

+0

我想你可以嘗試將ImageData轉換爲base64字符串,雖然這可能比使用putImageData和getDataURL需要更長的時間。 – Castrohenge 2010-07-23 13:44:16