2014-05-24 43 views
1

我有一个脚本,它会拍摄一张照片并创建黑白R,G和B通道。我想指出有多少频道有他们的东西(黑色=没有颜色,白色=彩色数据)。检查画布是否黑色

它通过遍历每个单个像素并将数据保存在3个不同的画布元素中。每一个显示不同的频道。

它工作的很好,但是当我只给红色和蓝色图片时,绿色通道(显然)是完全黑色的。

所以我的问题是,如何检查画布是否完全黑色?我想避免遍历每个通道中的每个像素,看它是否全黑。

欢呼

回答

2

好吧,我测试过要检查有数据的一些东西,我能想出是创造一个1x1的屏幕外的画布,然后绘制或者您的图片或帆布面料最简单的方法,缩小到1个像素并检查它(我还添加了基本缓存)。

这不是一个精确的检查,结果取决于像素数据在原始图像中的分布方式,如GameAlchemist指出的那样,如果您希望检查结果为0,则无论如何您都可以遍历所有像素准确的结果。

function quickCheck(img){ 
    var i = arguments.callee; //caching the canvas&context in the function 
    if(!i.canvas){i.canvas = document.createElement("canvas")} 
    if(!i.ctx) {i.ctx = i.canvas.getContext("2d")} 

    i.canvas.width=i.canvas.height = 1; 
    i.ctx.drawImage(img,0,0,1,1); 
    var result = i.ctx.getImageData(0,0,1,1); 
    return result.data[0]+result.data[1]+result.data[2]+result.data[3]; 
} 
+0

不知道这会的工作,因为黑色帆布有数据本身。所有像素都只是黑色。 –

+0

为例,你可以检查http://designer.vetosports.com/admin/ ..去添加设计,只是上传红色和蓝色的图片..或蓝色和绿色.. –

+0

是的,但不是你想要的东西吗?去检查? - > _所以我的问题是,如何检查画布是否完全黑色?我想避免循环遍历每个通道中的每个像素,以查看它是否全是黑色_ ** vs ** _不确定这是否可行,因为黑色画布本身具有数据。所有像素都只是黑色_ – Winchestro

0

您必须遍历画布的像素数据 --no魔术方法来避免这种情况。

迭代2张图片的性能代价很小(2张图片=您的正面图片和背面图片)。

[删除提问者访问的网站后,答案非必要的部分]

+0

+1我不知道在'.every'喷气式飞机上短路。:) – Winchestro

+1

手动循环比使用every()更有效率。 while(!ch [i ++] &&(i GameAlchemist

+0

@GameAlchemist在canvas大小的阵列中,我发现'while'和'every'之间没有实质性的区别。当使用画布大小的阵列时,Chrome35,FF29和IE11都会报告亚毫秒的性能。我会接受你的说法,“虽然”更快,但为此目的,它是“没有区别的差异”(不显着)。 :-) – markE