gpt4 book ai didi

c# - 判断位图是否全黑的有效方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:32:57 24 4
gpt4 key购买 nike

我想知道是否有一种 super 有效的方法来确认 Image 对象引用的是全黑图像,因此位图中的每个像素都是 ARGB(255, 0, 0, 0)。

你会推荐什么?这些位图中的大多数将是 1024 x 6000 像素(尽管假设它们总是那个大小是不安全的)。

我需要这个,因为我们在使用 PrintWindow API 时遇到了问题。我们发现在将近 20% 的情况下,至少图像的某些部分会是黑色方 block (后续捕获会成功)。我解决这个问题的想法是对每个子窗口调用 PrintWindow 或 WM_PRINT,然后将窗口的整个图像拼凑起来。如果我能找到一种有效的方法来检测 PrintWindow 是否为特定子窗口返回了黑色图像,那么我就可以在该捕获时快速再次调用 PrintWindow。这很糟糕,但 PrintWindow 是捕获适用于所有窗口(无论如何我想要)并支持捕获隐藏和/或屏幕外窗口的窗口的唯一方法。

当 PrintWindow 失败时,它不会设置错误代码或返回任何表明失败的信息。当它出现这个黑色方 block 问题时,总是整个窗口或子窗口返回黑色。因此,通过分别捕获每个子窗口,我可以确定我的每个捕获都有效,前提是它至少包含一个非黑色像素。

PrintWindow 在 Vista 及更高版本中显然更好,但在这种情况下我们仅限于 Server 2003。

最佳答案

我建议您使用 System.Drawing.Bitmap 类型的 LockBits 方法将位图锁定在内存中。此方法返回 BitmapData 类型,您可以从中接收指向锁定内存区域的指针。然后遍历内存,搜索非零字节(实际上,通过扫描 Int32 或什至 Int64 值更快,具体取决于您使用的平台)。代码将如下所示:

// Lock the bitmap's bits.  
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;

// Declare an array to hold the bytes of the bitmap.
int bytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[bytes];

// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, bytes);

// Scanning for non-zero bytes
bool allBlack = true;
for (int index = 0; index < rgbValues.Length; index++)
if (rgbValues[index] != 0)
{
allBlack = false;
break;
}
// Unlock the bits.
bmp.UnlockBits(bmpData);

考虑使用不安全代码和直接内存访问(使用指针)来提高性能。

关于c# - 判断位图是否全黑的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2556447/

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