如何将生成的位图加载到PictureBox中?

时间:2010-02-03 03:02:44

标签: c# image bitmap picturebox

似乎有许多图片框问题,但我没有发现将图片框的内容更改为不是简单地从文件加载的位图。

我的应用程序采用一个字节数组并从中生成一个位图。我真的想避免写入文件作为中间处理步骤。

因为它是一个字节数组,而不是2字节字,所以我需要用灰度调色板制作索引位图。

然后我将索引位图转换为普通位图(24位rgb)。

这是导致我出错的代码:

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

当我查看表单(图片框试图绘制)时,线程将简单地暂停执行并显示一条消息: “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”),我会得到一个完全可以接受的位图,似乎没有异常。

为什么我不能将我的位图用作我的picturebox.Image? 在将新位图加载到其中之前,我需要更改图片框的其他参数吗?

1 个答案:

答案 0 :(得分:4)

好吧,我发现了我正在做的事情。

我会尝试解释错误的原因,但作为一名非宗师,我不确定自己会有多准确。

显然在pictureBox中设置图像不会在任何地方复制内存。稍后在我的应用程序中(远离我显示的代码片段的一些函数)我正在处理变量“bmp1”。

我不知道与bmp1相关联的内存在函数传递的每个地方都是相同的内存,并且在销毁时会引发错误“System.Drawing.Image.get_RawFormat()中的无效参数”。我想这样做是因为每次重绘pictureBox时它都会使用它的“Image”属性来绘制。因为我正在处理与“Image”属性相关联的内存,所以我杀死了picturebox_Paint事件正常工作的所有希望。

我只希望我现在没有内存泄漏,因为我从未处理过我创建的任何位图。