我是新来的。 在我的应用程序中,我将位图图像分配给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;
提前致谢。
答案 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;
}