2012-01-11 6 views
1

Для мобильного приложения мне нужно создать 1-битный бит из 24-битного битового массива. Проблема в том, что результат неверен, поэтому я сделал этот небольшой проект, чтобы попробовать его на моем настольном ПК. создание работает, но результат не совсем, как вы можете видеть.24-бит-1 бит-бит-преобразование

Вы почти ничего не читаете, потому что много бит больше не находится в правильном положении, но перемещено несколько пикселей влево или вправо.

Это код, я использую для создания:

int z = 0; 
int bitNumber = 0; 
//the new 1Bit-byte-Array 
byte[] oneBitImage = new byte[(bmp.Height * bmp.Width)/8]; 

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
unsafe 
{ 
    byte* p = (byte*)(void*)bmData.Scan0.ToPointer(); 
    int stopAddress = (int)p + bmp.Height * bmData.Stride; 
    while ((int)p != stopAddress) 
    { 
    if (*p < 128) // is black 
    oneBitImage[z] = (byte)(oneBitImage[z] | Exp(bitNumber)); //Set a Bit on the specified position 
    p += 3; 

    bitNumber++; 

    if (bitNumber == 8) 
    { 
     bitNumber = 0; 
     z++; 
    } 
    } 
} 

bmp.UnlockBits(bmData); 

//Convert into 1-bit-bmp to check result 
Bitmap newbmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format1bppIndexed); 

BitmapData bmpData = newbmp.LockBits(
          new Rectangle(0, 0, newbmp.Width, newbmp.Height), 
          ImageLockMode.WriteOnly, newbmp.PixelFormat); 

Marshal.Copy(oneBitImage, 0, bmpData.Scan0, oneBitImage.Length); 

newbmp.UnlockBits(bmpData); 

newbmp.Save(fileName, ImageFormat.Bmp); 

Краткое объяснение: Я бегу через каждый третий байт, и если этот байт - первый один из 3-байт-группы (пиксел 24 -бит) - ниже 128, я немного помещаю в указанную позицию. EXP дает мне экспоненту ...

ответ

2

Переключите бит в каждый выходной байт. Бит 7 должен быть бит 0 и т. Д.

+0

Благодарю вас, сэр, вы удивительны. Я искал эту ошибку f ** king часами, все пробовал, но я был глуп, чтобы понять это. Кажется логичным для меня сейчас, что вы сказали мне ... я вам должен один - С уважением Карл – Karl

+0

ОК. Но Алекс тоже прав, знаете ли, не просто принимайте значение синих каналов, но и учитывайте другие каналы. –

+0

Да, но я сам создаю 24-битное изображение только с черным и белым, что не обязательно проверять других и делать еще два сравнения ... – Karl

1

Я бы преобразовал три байта в «реальный» цвет (длинное значение или подобное) и посмотрел, превышает ли результат более половины 16,7 м.

+0

Я согласен частично. Это не значит, что изображение сдвинуто, но я бы действительно принял во внимание все три цветовых байта при преобразовании в изображение 1 bpp. Я был бы склонен считать пиксель черным, если какой-либо из его цветных октетов был ближе к 00, чем FF. Но опять же, это не проблема сдвига пикселей. – tcarvin

+0

Вы правы. Я не думал о проблемах с смещенными битами. Преобразование трех байтов в цвет было моей первой мыслью – AlexS