【问题标题】:Javascript - getImageData on canvas always returns alpha 255Javascript - 画布上的 getImageData 始终返回 alpha 255
【发布时间】:2016-04-29 04:46:56
【问题描述】:

我正在尝试使用 javascript 和画布读取图像中的 alpha 值,但 getImageData 返回的 ImageData 的 alpha 部分始终为 255,即使处理后的图像仅包含透明像素。这就是我所做的:

var img = new Image();
img.src = "url/to/an/image/with/transparency";
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
context.drawImage(img, 0, 0);
var data = context.getImageData(0, 0, img.width, img.height).data;
for(var i = 0; i<data.length; i+=4){
    console.log(data[i+3]);
}

这总是输出 255。我已经找到了,但它并没有真正帮助我: newbie keeps losing alpha values in canvas

不管我怎么尝试,它都行不通。

编辑:这是我的完整代码:http://pastebin.com/3giQCWvP

错误发生在 generateCollisionGrid() 函数内部。我发现红色和绿色也总是 255。

这是我用来测试的图片:https://addons.opera.com/media/extensions/03/1303/1.4-rev1/icons/icon_64x64.png

【问题讨论】:

  • while 循环是怎么回事,你已经有一个处理图像何时加载的处理程序?
  • while(!ready){} => 无限循环?
  • @adeneo 谢谢,我忘了我从我的代码中删除了这部分。

标签: javascript canvas


【解决方案1】:

我遇到了同样的问题,发现我需要设置 context.globalCompositeOperation = "copy" 以确保 alpha 覆盖目标数据。

【讨论】:

    【解决方案2】:

    您的代码可能存在几个问题:

    • 图像可能不是真正透明的。
    • 当您尝试绘制图像时,图像可能未完全加载。使用 img.onload 等待 img 完全加载后再尝试绘制。
    • 当您createElement('canvas') 时,画布的默认大小为 300x150,因此您的图像可能大于或小于默认画布大小。使用canvas.width=img.width & canvas.height=img.height 将画布大小设置为img大小。
    • 如果图像 URL 来自与网页不同的域,则会引发安全错误。此错误情况将阻止 .getImageData 返回数据。

    以下是您的代码重构以避免这些问题:

    var img=new Image();
    img.crossOrigin='anonymous';
    img.onload=start;
    img.src="https://dl.dropboxusercontent.com/u/139992952/multple/icon_64x64.png";
    function start(){
    
        var canvas = document.createElement('canvas');
        document.body.appendChild(canvas);
        canvas.width=img.width;
        canvas.height=img.height;
        var context = canvas.getContext('2d');
        context.drawImage(img, 0, 0);
        var data = context.getImageData(0, 0, img.width, img.height).data;
        var alphas=''; // demo purposes
        for(var i = 0; i<data.length; i+=4){
            console.log(data[i+3]);
            if(i<200){alphas+=data[i+3]+',';} // demo purposes
        }
    
        alert(alphas); // demo purposes
    }
    body{ background-color: ivory; }
    canvas{border:1px solid red; margin:0 auto; }

    【讨论】:

    • 感谢您的帮助。我根据您的示例更改了我的代码,我只是不将画布附加到我的文档正文中。我仍然得到 255 作为 alpha。
    • 请张贴您的图片。
    • 我刚刚将所有的 rgba 值打印到我的控制台,它们都是错误的,红色、绿色和 alpha 始终为 255,蓝色始终为 153。这是我使用的图像:addons.opera.com/media/extensions/03/1303/1.4-rev1/icons/…跨度>
    • 您的 img 在 generateCollisionGrid 内有效吗?作为测试(在 generateCollisionGrid 内),将 img 附加到页面并复制到您的桌面。桌面图像是否看起来不透明?
    • @Kaiido。当然,但我指出了代码中的几个弱点……不仅仅是最接近的。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2017-12-15
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多