Как я могу загрузить сгенерированный рисунок в PictureBox? - PullRequest
4 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

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

Вот что создает "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 Ответ

4 голосов
/ 03 февраля 2010

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

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

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

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

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

...