这是一个获取透明和白色图像并尝试将其转换为布尔数组的函数。
我的单元测试代码给了我 2 张我期望的图像(见下文),但“numberOfMasked”总是高于我的预期。例如,如果“maskBuffer”标记了一个像素(参见下面的 mask_image_test.bmp),那么尽管“mask_bool_test70.bmp”)创建了一个标记了一个像素的图像。由于某种原因,标记为 true 的实际布尔值要高得多,而且看起来是随机的。我看到它的范围是 25 - > 70。
public static bool[] ConvertImageToBoolAray(Bitmap maskbuffer)
{
bool[] mask = null;
int w = maskbuffer.Width;
int h = maskbuffer.Height;
#region unit_test
maskbuffer.Save("mask_image_test.bmp");
#endregion
lock (maskbuffer)
{
BitmapData bmpData = maskbuffer.LockBits(new Rectangle(0, 0, w, h),
ImageLockMode.ReadOnly,
PixelFormat.Format8bppIndexed);
const int numBmpChannel = 1;
int maskIndex = 0;
int bmpIndex = 0;
unsafe
{
byte* pixels = (byte*) bmpData.Scan0;
int numPixels = w*h;
mask = new bool[numPixels];
for (;
maskIndex < numPixels;
bmpIndex += numBmpChannel, maskIndex++)
{
byte red = pixels[bmpIndex];
bool masked = red != 0;
mask[maskIndex] = masked;
}
}
maskbuffer.UnlockBits(bmpData);
}
#region unit_test
byte[] boolAsByte = Array.ConvertAll(mask, b => b ? (byte)1 : (byte)0);
Bitmap maskBitmap = GLImageConvertor.ConvertByteBufferToBitmap(boolAsByte, w, h, PixelFormat.Format8bppIndexed);
int numberOfMasked = mask.Count(b => b);
maskBitmap.Save("mask_bool_test" + numberOfMasked + ".bmp");
#endregion
return mask;
}
有人对这种奇怪的行为有任何想法吗?
调试表明,在“像素”内存中,有一些我没想到的字节,我希望看到一个字节设置为“FF”,但我有随机的数据部分。
mask_image_test.bmp:
mask_bool_test70.bmp: