|
|
1
20
我建议您使用system.drawing.bitmap类型的lockbits方法将位图锁定在内存中。此方法返回BitmapData类型,从中可以接收指向锁定内存区域的指针。然后遍历内存,搜索非零字节(实际上,通过扫描int32或甚至int64值更快,这取决于您使用的平台)。 代码如下:
考虑使用不安全的代码和直接内存访问(使用指针)来提高性能。 |
|
|
2
7
如果您对图像非黑色的条件了解得更多,这将更容易。例如,当图像非黑色时,图像的边缘或中心是什么样子的?本质上,你创建的是启发式的猜测非黑图像,并采样那些区域,将给你最快的阅读。如果您的启发式指示一个全黑图像,那么您可以决定它是全黑的,或者对所有像素进行完全检查。但这很大程度上取决于你的图像。如果您必须能够区分全黑图像和在随机位置包含单个非黑像素的图像,则必须检查所有图像。 |
|
|
3
6
Lock the bitmap into memory
用逐位运算扫描。不使用
|
|
|
4
6
这篇文章的第一个答案很好。我修改了代码,以更一般地确定图像是否都是一种颜色(全黑、全白、全品红等等)。假设您有一个包含4个部分颜色值argb的位图,将每种颜色与左上角的颜色进行比较(如果有不同的颜色),则图像不都是一种颜色。
|
|
|
5
3
使用Aforgenet库( http://www.aforgenet.com )也可以是一个解决方案:
对于ImageStatistics类,请在项目中引用aforge.imaging.dll。 http://code.google.com/p/aforge/source/browse/trunk/Sources/Imaging/ImageStatistics.cs |
|
6
2
用一个对角线中有3 x 255的颜色矩阵绘制位图,它将把任何非黑色像素吹成纯白色。然后将该位图绘制成一个较小的位图,其宽度是4的倍数,格式为24bpprgb。这样就消除了alpha,减小了大小,如果位图真的是黑色的,则只留下零。 你需要做一些实验,看看你能让位图变得多小,用一个只有一个白色像素的示例来看看插值器什么时候能让它消失。我猜你可以走很远。 |
|
|
7
1
成为 完全 要确定图像的黑度,您必须检查每个像素,在不安全的块中访问像素数据可能是最快的方法。当然,有可能对非黑色的情况进行优化,并尝试更早地找到那些,但在最坏的情况下,您总是需要检查每个像素。 |
|
|
8
1
只是一些随机的想法:
|
|
|
9
1
一个相当可靠的方法是检查图像的文件大小。也就是说,如果不是全黑的图像有一个相对正态分布的颜色。 如果你知道文件类型,你就知道一些关于平均压缩比的基本知识。您可以很容易地确定文件的维度,而无需循环整个文件。 任何尺寸的全黑图像,使用压缩文件格式,与具有相同尺寸且颜色分布相当正常的图像相比,文件大小都非常小。 这个方法需要花费一点时间来测试和建立一个知识库,来确定一个全黑图像的文件大小应该与一个非全黑图像进行比较,但是它会非常快。 如果您有许多非全黑图像非常接近全黑的实例,显然,这种方法将不起作用。 |
|
|
10
1
我有一个想法,在盒子外面。 A怎么样 CRC checksum ?您可以首先检查图像的尺寸,然后计算校验和,并将其与相同尺寸的全黑图像的已知(预先计算)校验和进行比较。 编辑:我怀疑这会比@leonard的方法快。唯一的原因可能是原始文件不是位图,而是压缩后的图像格式。这样,CRC校验和算法就不必在运行之前解压缩图像。 |
|
|
11
0
|
|
|
12
0
一个可能也能做到这一点的诀窍是在某个地方放置一个指示器像素,它总是具有相同的颜色,除非图像捕获失败,在这种情况下,我假设所有东西都是完全黑色的。 |
|
|
user2257918 · 为什么此代码不创建棋盘格图案? 7 年前 |
|
|
Ally · 在位图上绘制长字符串会导致绘图问题 7 年前 |
|
|
Melih · 谷歌移动视觉低图像质量 7 年前 |
|
|
Dhruv Chadha · OpenGL图像未映射到坐标 7 年前 |