Вот функция, которая принимает прозрачное и белое изображение и пытается превратить его в массив bool.Почему этот черно-белый растровый рисунок в Bool Array создает правильные изображения, но устанавливает неправильное количество bools (C#)
Мой блок-код дает мне 2 изображения, которые я ожидал бы (см. Ниже), но «numberOfMasked» всегда выше, чем я ожидаю. Например, если «maskBuffer» имеет один отмеченный пиксель (см. Ниже mask_image_test.bmp), то хотя «mask_bool_test70.bmp») создает изображение с отмеченным одним пикселем. По какой-то причине фактическое количество балов, отмеченных как истинное, намного выше и, по-видимому, случайное. Я видел, что он варьируется от 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:
ли вы отладки это? – nvoigt
Да, извините, я должен был добавить более подробно, сделаю – chrispepper1989