Кажется, что классы 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.