Я разрабатываю программу, которая получает изображение с устройства камеры.Вот событие, как я получаю изображение.
private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
{
IGrabResult res = e.GrabResult;
byte[] pixels = res.PixelData as byte[];
pictureBox1.Image = ByteArrayToBitmap(pixels,res.Width,res.Height, PixelFormat.Format8bppIndexed);
//ImagePersistence.Save(ImageFileFormat.Jpeg, "tmp/tmp" + i + ".jpg", img);
}
Я могу получить массив данных пикселей с кодом выше.И я могу напрямую сохранить изображение с помощью одной строки кода.
ImagePersistence.Save(ImageFileFormat.Jpeg, "tmp/tmp" + i + ".jpg", img);
Теперь моя проблема начинается здесь.Я не хочу его сохранять, я просто хочу создать объект Bitmap из данных пикселей и просто показать его в моем объекте pictureBox1.У меня есть данные пикселей изображения, но в любом случае я не мог получить изображение правильно.
Вот функция ByteArrayToBitmap;
public Bitmap ByteArrayToBitmap(byte[] byteIn, int imwidth, int imheight, PixelFormat pixelformat)
{
Bitmap picOut = new Bitmap(imwidth, imheight, pixelformat);
BitmapData bmpData = picOut.LockBits(new Rectangle(0, 0, imwidth, imheight), ImageLockMode.WriteOnly, pixelformat);
IntPtr ptr = bmpData.Scan0;
Int32 psize = bmpData.Stride * imheight;
System.Runtime.InteropServices.Marshal.Copy(byteIn, 0, ptr, psize);
picOut.UnlockBits(bmpData);
return picOut;
}
А вот как выглядит изображение;
КакВы можете видеть, изображение странное.Сначала я подумал, если это проблема камеры.Но я попробовал с его собственной программой, камера работает отлично.Что-то идет не так с моим кодом.
Я даю полезную информацию с экрана отладки;
Размер изображения 3840x2748.
Размер байтового массива пиксельных данных составляет 10,552..320
Я сделал этот расчет: 3840 * 2748 = 10.552.320 Изображение не в градациях серого, это RGB-изображение,
Так что я подумал, что данные пикселей содержат 8-битную индексациюпиксели.
Я застрял с этой проблемой.Я попытался дать вам всю полезную информацию о моей проблеме.
Как правильно получить изображение и правильно создать растровый объект?
РЕДАКТИРОВАТЬ
public Bitmap CopyDataToBitmap(int Width, int Height, byte[] data)
{
var b = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
ColorPalette ncp = b.Palette;
int counter = 0;
for (int i = 32; i <= 256; i+=32) //for R channel (3 bit)
for (int j = 32; j <= 256; j+=32) //for G Channel (3 bit)
for (int k = 64; k <= 256; k+=64) //for B Channel (2 bit)
{
ncp.Entries[counter] = Color.FromArgb(255,i-1,j-1,k-1);
counter++;
}
b.Palette = ncp;
var BoundsRect = new Rectangle(0, 0, Width, Height);
BitmapData bmpData = b.LockBits(BoundsRect,
ImageLockMode.WriteOnly,
PixelFormat.Format8bppIndexed);
IntPtr ptr = bmpData.Scan0;
int bytes = bmpData.Stride * b.Height;
var rgbValues = new byte[bytes];
Marshal.Copy(data, 0, ptr, bytes);
b.UnlockBits(bmpData);
Console.WriteLine(b.GetPixel(3648, 1145).ToString());
return b;
}
Я изменил алгоритм с этой функцией.Я использую цветовую палитру.Но результат все тот же.
ColorPalette ncp = b.Palette;
for (int i = 0; i < 257; i++)
ncp.Entries[i] = Color.FromArgb(255, i, i, i);
b.Palette = ncp;
Когда я использую эту палитру, на этот раз изображение становится оттенком серого.
Я просто хочу получить четкое изображение RGB.
EDIT 2
Пиксельный формат моей камеры - BayerBG8.Я не знаю, поможет ли это.