【问题标题】:getDataURL for part of the canvas object部分画布对象的 getDataURL
【发布时间】:2010-07-22 13:53:22
【问题描述】:

我正在构建一个 firefox 插件,它允许用户在对象上绘制任意图形并将其保存为图像(png 文件)。

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");

【问题讨论】:

    标签: canvas firefox-addon data-url


    【解决方案1】:

    您可以将已绘制的左上角和右下角坐标存储在您的 handlePenDraw 方法中,然后使用 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");
    

    【讨论】:

    • 哇!多谢! getImageData() 是我正在寻找的函数!
    • 您的解决方案运行良好。但是,我有一个后续问题。我注意到 putImageData() 方法将图像添加到画布需要更长的时间。相反,有没有办法从 imageData 本身中提取 dataURL ?这样我就可以减少制作图像所需的时间。有任何想法吗?如果允许,我可以手动构建 base64 字符串。
    • 我想您可以尝试将 ImageData 转换为 base64 字符串,尽管这可能比使用 putImageData 和 getDataURL 需要更长的时间。
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2013-02-08
    • 2015-12-14
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多