Как загрузить сгенерированный Bitmap в PictureBox?

Похоже, что есть много вопросов с изображениями, но я не обнаружил, что это связано с изменением содержимого графического ящика на растровое изображение, которое не было просто загружено из файла.

Мое приложение принимает массив байтов и генерирует растровое изображение из них. Я действительно хочу избежать записи в файл в качестве промежуточного этапа обработки.

Поскольку это массив байтов, а не 2-байтовые слова, мне нужно было сделать индексированное растровое изображение с палитрой серого.

Затем я преобразовал индексированную растровую карту в обычную (24 бит rgb).

Это код, который вызывает ошибку для меня:

pictureBox1.Image = (System.Drawing.Image)bmp2;

Когда я просматриваю форму (фотошоп пытается рисовать), поток просто прекратит выполнение с сообщением: msgstr "неверный параметр в System.Drawing.Image.get_RawFormat()"

Что я делаю неправильно? Как создать безопасное растровое изображение для изображения?

Это то, что создает "bmp2":

//creating the bitmap from the array
System.Drawing.Bitmap bmp1 = new System.Drawing.Bitmap(100, 100, 100, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, MyIntPtr);

//creating a proper indexed palette
System.Drawing.Imaging.ColorPalette GrayPalette = bmp1.Palette;
for (int i = 0; i < GrayPalette.Entries.Length; i++)
{
    GrayPalette.Entries[i] = Color.FromArgb(i, i, i);
}
bmp1.Palette = GrayPalette;

//creating a non-indexed, 24bppRGB bitmap for picturebox compatibility
System.Drawing.Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics gr = Graphics.FromImage(bmp2);
gr.DrawImage(bmp1, 0, 0);
gr.Dispose();

Если я использую bmp1.Save(@ "testfile.bmp" ), я получаю вполне приемлемое растровое изображение, которое кажется без аномалии.

Почему я не могу использовать свой растровый образ в качестве своего изображения. Я думаю? Есть ли дополнительные параметры изображения, которые мне нужно изменить, перед загрузкой в ​​него нового растрового изображения?

Ответ 1

Ну, я нашел проблему с тем, что я делал.

Я попытаюсь объяснить, что случилось, но как негуру я не уверен, насколько я буду точен.

Очевидно, что установка изображения в pictureBox не копирует память нигде. Позже в моем приложении (несколько функций от фрагмента кода, который я показал), я удалял переменную "bmp1".

Я не знал, что память, связанная с bmp1, была той же самой памятью, где функция передавала ее, а при ее уничтожении была исправлена ​​ошибка "недопустимый параметр в System.Drawing.Image.get_RawFormat()". Я полагаю, это происходит потому, что каждый раз, когда pictureBox перерисовывается, он использует свойство "Image", чтобы рисовать. Поскольку я удалял память, связанную с свойством "Изображение", я убивал все надежды на правильность работы picturebox_Paint.

Я только надеюсь, что у меня нет утечек памяти сейчас из-за того, что я никогда не удаляю какие-либо растровые изображения, которые я создаю.