gpt4 book ai didi

javascript - 查看 Canvas 是否有任何数据(黑色除外)

转载 作者:行者123 更新时间:2023-12-03 12:21:15 24 4
gpt4 key购买 nike

我正在创建一个小应用程序,在其中拍照并提取 RGB channel (将它们放入 3 个单独的 Canvas 中)并将它们转换为 alpha 蒙版,请参见下文。 enter image description here

我必须检查生成的 channel 中是否有任何数据(黑色除外)。检查这一点最有效的方法是什么?

最准确的方法是循环遍历所有像素并查看某些值是否大于 0。但我想避免这种情况以节省一些处理器速度(特别是因为网络应用程序将在手机/平板电脑上使用)。

我尝试使用临时 Canvas ,在其中保存一个图层并将其缩小到 1px,然后检查图像数据。这有效但不准确。我还尝试缩小到 10x10px,它更准确,但在第三张图片上它仍然给我错误。

我使用这个简单的代码来缩小结果

ctx.drawImage(bc,0,0,8,10)
fdata = ctx.getImageData(0,0,8,10)

对于上面显示的图像。这个方法给了我:

第一张图片:0,0,0,253(检测到的数据)

第二张图片:0,0,0,2(检测到)

第三张图片:0,0,0,255(未检测到)。

有什么想法吗?

最佳答案

你还可以做什么:使用临时的、一次性实例化的 Canvas ,例如 16X16 大小,然后对于每个测试:
- 清除此 Canvas 。
- 循环遍历原始图像的每个 16X16 block 并将其复制到 Canvas 上。
- 检查 Canvas 的图像数据。

类似于(未经测试):

var isBlank = (function () {
var blockSize = 16;
var tstCv = document.createElement('canvas');
tstCv.width = blockSize;
tstCv.height = blockSize;
var tstCtx = tstCv.getContext('2d');

function _isBlank(tgtCanvas) {
tstCtx.clearRect(0, 0, blockSize, blockSize);
for (var y = 0; y < tgtCanvas.height; y += blockSize) {
for (var x = 0; x < tgtCanvas.width; x += blockSize) {
tstCtx.drawImage(tgtCanvas, x, y, blockSize, blockSize, 0, 0, blockSize, blockSize);
}
}
var data = tstCtx.getImageData(0, 0, blockSize, blockSize).data;
var i = 0,
l = data.length;
while (i != l) {
if ( data[i+3]!=255 /* some test on data[i+?] */ ) return false;
i += 4;
}
return true;
}
return _isBlank;
})();

它应该非常高效,因为您将使用显卡逐 block 求和像素,之后您只需手动检查少量数据。

关于javascript - 查看 Canvas 是否有任何数据(黑色除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com