Преобразование 24-битного в 1-битное растровое изображение

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

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

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

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 дает мне показатель степени...


person Karl    schedule 11.01.2012    source источник


Ответы (2)


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

person Mr Lister    schedule 11.01.2012
comment
Спасибо, сэр, вы потрясающие - я часами искал эту чертову ошибку, перепробовал все, но я был слишком глуп, чтобы понять это. Теперь мне кажется логичным, что ты мне сказал... Я тебе должен - С уважением Карл - person Karl; 11.01.2012
comment
В ПОРЯДКЕ. Но AlexS тоже прав, знаете ли; учитывайте не только значения синих каналов, но и другие каналы. - person Mr Lister; 11.01.2012
comment
да, но я сам создаю 24-битное изображение только с черным и белым, что избавляет от необходимости проверять и остальные и делать еще два сравнения... - person Karl; 11.01.2012

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

person AlexS    schedule 11.01.2012
comment
Я согласен частично. Это не причина, по которой изображение смещается, но я действительно учел бы все три байта цвета при преобразовании в изображение с разрешением 1 бит на пиксель. Я был бы склонен считать пиксель черным, если бы какой-либо из его цветовых октетов был ближе к 00, чем к FF. Но опять же, это не проблема смещения пикселей. - person tcarvin; 11.01.2012
comment
Ты прав. Я недостаточно думал о проблеме сдвинутых битов. Моей первой мыслью было преобразовать три байта в цвет. - person AlexS; 11.01.2012