【问题标题】:How can I load a generated Bitmap into a PictureBox?如何将生成的位图加载到 PictureBox 中?
【发布时间】:2011-01-12 11:04:26
【问题描述】:

那里似乎有很多图片框问题,但我还没有找到任何涉及将图片框的内容更改为不是简单地从文件加载的位图的问题。

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

因为它是一个字节数组,而不是 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? 在将新位图加载到其中之前,我需要更改图片框的其他参数吗?

【问题讨论】:

    标签: c# image bitmap picturebox


    【解决方案1】:

    嗯,我发现我正在做的事情有问题。

    我会尝试解释哪里出了问题,但作为非专家,我不确定我的准确度。

    显然在图片框中设置图像不会在任何地方复制内存。稍后在我的应用程序中(我展示的代码 sn-p 之外的几个函数)我正在处理变量“bmp1”。

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

    我只希望我现在不会因为从不处理我创建的任何位图而导致内存泄漏。

    【讨论】:

    • GC 应该负责内存。
    • @SLaks:GC 会处理内存,但不会释放 Bitmap 对象使用的本机资源。 IDisposable接口是有原因的,使用它。
    • @EdSwangren:错误IDisposable 拥有本机资源的对象将在终结器中处置本机资源。请参阅 Dispose 模式。
    • @SLaks:是的,但未指定调用终结器的确切时间。如果您不调用 dispose,那么您只是一个懒惰的程序员。我不应该说“不会”,但如果你想要确定性,请调用 dispose。处置/关闭/等是有原因的。方法存在。我猜你可能会占用将来某个未指定时间释放的资源,但我不是。这可能是因为我是一名系统工程师,其中一个错误可能会花费很多钱并可能伤害某人。
    • ...当然,我们不会将 C# 用于...在我的领域中的任何东西,所以嗯。
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多