Преобразование 24-бит в 1 бит - PullRequest
1 голос
/ 11 января 2012

Для мобильного приложения я должен сгенерировать 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 дает мне показатель степени ...

Ответы [ 2 ]

2 голосов
/ 11 января 2012

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

1 голос
/ 11 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...