2010-07-22 38 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