我想知道是否有一种超级有效的方法来确认 Image 对象引用全黑图像,因此位图中的每个像素都是 ARGB(255, 0, 0, 0)。
你会推荐什么?大多数位图的尺寸为 1024 x 6000 像素(尽管假设它们始终是该尺寸并不安全)。
我需要这个,因为我们在使用 PrintWindow API 时遇到问题。我们发现,近 20% 的情况下,图像的至少某些部分会是黑色方块(后续捕获将会成功)。我解决这个问题的想法是对每个子窗口调用 PrintWindow 或 WM_PRINT,然后将窗口的整个图像重新组合在一起。如果我能找到一种有效的方法来检测 PrintWindow 返回特定子窗口的黑色图像,那么我可以快速在该捕获上再次调用 PrintWindow。这很糟糕,但 PrintWindow 是捕获适用于所有窗口(无论如何我想要的)的窗口的唯一方法,并且支持捕获隐藏和/或屏幕外的窗口。
当 PrintWindow 失败时,它不会设置错误代码或返回任何指示失败的内容。当出现黑色方块问题时,总是整个窗口或子窗口返回黑色。因此,通过单独捕获每个子窗口,我可以确保我的每个捕获都有效,前提是它至少包含一个非黑色像素。
显然,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);
考虑使用不安全代码和直接内存访问(使用指针)来提高性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)