位图图像分配给Winforms中的Picturebox时应用程序崩溃

时间:2018-01-27 05:57:18

标签: c# winforms bitmap

我是新来的。 在我的应用程序中,我将位图图像分配给picturebox。但过了一段时间我的应用程序崩溃。我也maintan尝试捕获和日志,但应用程序只是崩溃。 这是我的代码:

     System.Drawing.Bitmap ImageBMP = new System.Drawing.Bitmap(ImageWidth, ImageHeight, stride, PixelFormat.Format8bppIndexed, new IntPtr(scan0));
     if (Picturebox1!= null && Picturebox1.Image != null)
     {
           Picturebox1.Image.Dispose();
           Picturebox1.InitialImage = null;
     }
     Picturebox1.Image =ImageBMP;

提前致谢。

2 个答案:

答案 0 :(得分:1)

因为你把对象放在了if块里面。删除它,它不会给出错误。

Picturebox1.Image.Dispose();

希望有所帮助,

答案 1 :(得分:0)

你在那里使用原始指针。它来自哪里?建议使用托管数组,除非您可以100%确定该指针仍然有效。

如果它来自另一个图片上的LockBits操作,那么 将无法保持有效;从其他图像解锁的那一刻起它就会停止可靠。

如果您计划克隆或编辑8bpp图像,使用Byte[]和{{1将正在管理的图像的内容复制到普通的托管LockBits数组会更安全并以相同的方式将它们复制回Marshal.Copy个对象,而不是直接使用指针。

这些代码应该让你顺利开始:

从图像中获取支持字节数组:

Bitmap

从字节数组创建图像:(而不是从指针)

并且,结合并优化:

对图片进行深度克隆以加载它而不使用任何链接资源

请注意,对于您的处理......您永远不应该丢弃仍然链接到UI的图像,因为UI的下一次重新绘制将尝试使用已处理的图像,这将不可避免地导致崩溃。正确的方法是将图像引用存储在变量中,然后在UI上将其设置为null,然后然后处理它:

/// <summary>
/// Gets the raw bytes from an image.
/// </summary>
/// <param name="sourceImage">The image to get the bytes from.</param>
/// <param name="stride">Stride of the retrieved image data.</param>
/// <returns>The raw bytes of the image</returns>
public static Byte[] GetImageData(Bitmap sourceImage, out Int32 stride)
{
    BitmapData sourceData = sourceImage.LockBits(new Rectangle(0, 0, sourceImage.Width, sourceImage.Height), ImageLockMode.ReadOnly, sourceImage.PixelFormat);
    stride = sourceData.Stride;
    Byte[] data = new Byte[stride * sourceImage.Height];
    Marshal.Copy(sourceData.Scan0, data, 0, data.Length);
    sourceImage.UnlockBits(sourceData);
    return data;
}