создать растровое изображение с файловым потоком - PullRequest
1 голос
/ 27 марта 2011

Мне нужно создать растровое изображение с файловым потоком.Пока у меня есть этот код:

 using (FileStream bmp = File.Create(@"C:\test.bmp"))
        {
            BinaryWriter writer = new BinaryWriter(bmp);
            int i = 0;

          //  writer.Write((char*)&fileheader, sizeof(fileheader));
          //  writer.Write((char*)&infoheader, sizeof(infoheader));

            for (int rows = 0; rows < 160; rows++)
            {
                for (int cols = 0; cols < 112; cols++)
                {
                    writer.Write(CamData[i]);
                    i++;
                }
            }

            bmp.Close();
        }

, но мне все еще нужны данные заголовка для растрового изображения.Моя проблема в том, что я не знаю, как реализовать их в C #.Я знаю, что разрешение (320 x 240) и мои пиксельные данные представляют собой 16-битные значения оттенков серого, заданные в массиве ushort.

спасибо

Ответы [ 3 ]

0 голосов
/ 27 марта 2011

Попробуйте это:

/// From stream to bitmap...
FileStream fs = new FileStream("test.bmp", FileMode.Open);
Bitmap bmp = new Bitmap(fs);
0 голосов
/ 10 января 2018

Кажется, что классы System.Drawing не любят обрабатывать 16-битную шкалу серого, вероятно, потому, что базовый объект GDI + видит свои цветовые компоненты как значения от 0 до 255, тогда как 16-битная шкала серого фактически означает, что вы можете иметь 65535 оттенков серого.

Это означает, что у вас есть два варианта: либо вы переключаетесь на PresentationCore и создаете свое изображение с этим, либо вы уменьшаете значения до байтового размера и делаете 8-битное изображение в градациях серого.

ПервыйОпция описана в этот ответ .

Второй вариант включает в себя три шага:

  • Уменьшение данных до 1 байта на пиксель
  • Генерацияцветовая палитра оттенков серого (поскольку техническая палитра оттенков серого 8-битная)
  • Создание 8-разрядного индексированного изображения из данных и палитры с пониженной дискретизацией.

Код:

Byte[] camDataBytes = new Byte[CamData.Length];
for(Int32 i = 0; i < camData.Length; i++)
    camDataBytes[i] = (Byte)(CamData[i] / 256);

Color[] palette = new Color[256];
for(Int32 i = 0; i < 256; i++)
    palette[i] = Color.FromArgb(i,i,i);

using(Bitmap b = BuildImage(camDataBytes, 320, 240, 320, PixelFormat.Format8bppIndexed, palette, null))
    b.Save(@"C:\test.bmp", ImageFormat.Bmp); 

Функцию BuildImage для создания изображения из байтового массива можно найти здесь .Предполагая, что данные изображения имеют компактный размер 320x240, шаг конечного байтового массива должен быть точно равным ширине, и, следовательно, 320.

0 голосов
/ 27 марта 2011

Существует конструктор для создания Bitmap из байтового массива. Затем сохраните его в поток в формате bmp, используя функции-члены Bitmap. См. здесь и здесь .

...