【问题标题】:html5 canvas copy imageData to tmpcanvashtml5画布复制imageData到tmpcanvas
【发布时间】:2014-01-30 06:21:09
【问题描述】:

我在 HTML5 画布中创建了一个应用程序,用于裁剪图像。 DOM 中有 3 个画布,一个用于绘制线条,一个用于原始图像,另一个用于结果。

这是我使用的代码。

// copy image data to secondary canvas
var pixelData = ctx.getImageData(x-10, y-10, 20, 20);
var tmpCanvas = document.createElement("canvas");
tmpCanvas.width = 20; tmpCanvas.height = 20;
var tmpCtx = tmpCanvas.getContext("2d");
tmpCtx.putImageData(pixelData, x, y);
var tmpImageEl = document.createElement("img");
tmpImageEl.onload = function(){
    ctxCopy.drawImage(this, x, y);
}
console.log(tmpCanvas.toDataURL());
tmpImageEl.src = tmpCanvas.toDataURL();
//ctxCopy.putImageData(pixelData, x, y);

//document.getElementsByTagName("body")[0].appendChild(tmpCanvas);

在这一行

tmpImageEl.src = tmpCanvas.toDataURL();

我只得到空白/透明图像。我期望的是原始来源的图像数据..代码有什么问题?如果 putImageData 有四舍五入的选项,这对我来说可能更容易(我已经在谷歌上搜索了四舍五入的 putImageData,没有运气)

【问题讨论】:

  • 也许您可以澄清代码示例,以便我们清楚地看到 3 个画布和工作流程。什么是 ctxCopy?
  • 什么是ctxCopy,它来自哪里?您的源代码中缺少它。
  • 创建临时镜像的原因是什么?您可以将drawImage 与另一个画布一起用作源参数。
  • 嘿,对不起。这是完整的脚本(assets/js/app.js)comicedu.com/htmlcropper/v2 请尝试上传您的图片,然后您的图片将应用于画布,然后您可以在画布中绘制,我希望可以将源复制到结果画布(在底部)

标签: javascript html canvas


【解决方案1】:

您的ctxCopy 似乎没有定义;你可能打算这样做:

var tmpCtx = tmpCanvas.getContext("2d");
...
tmpImageEl.onload = function(){
    tmpCtx.drawImage(this, x, y);    /// for your temporary canvas
    //ctxCopy.drawImage(this, x, y);    
}

Chrome 中还有一个问题是 data-uris 作为源;您可以通过先设置一个空字符串,然后设置 data-uri 来解决这个问题:

tmpImageEl.src = '';
tmpImageEl.src = tmpCanvas.toDataURL();

但是,您可以在临时画布上直接使用drawImage() 方法直接在源画布中绘制(它可以将图像、画布和视频作为源输入):

var tmpCanvas = document.createElement("canvas");
tmpCanvas.width = tmpCanvas.height = 20;
var tmpCtx = tmpCanvas.getContext("2d");

tmpCtx.drawImage(ctx.canvas, 0, 0);

不需要getPixelData()/putImageData()/image,这样会快很多。

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多