我尝试了许多解决方案来删除GDI +中发生的通用错误但是没有任何对我有用,我发布了我曾经使用过的代码。这个错误发生在服务器机器上 图像字节在数据库中成功存储,但在PictureBox上无法检索。
第一种方法:
ODetail.InsuranceCardImages 包含来自数据库的图像的字节。
pcinsurance 是我的PictureBox
System.Byte[] imagefront = (byte[])oDetail.InsuranceCardImage;
//this.pcInsurance.Image = Utility.byteArrayToImage(oDetail.InsuranceCardImage);
MemoryStream ms = new MemoryStream(imagefront);
try
{
//Process currentProcess1 = Process.GetCurrentProcess();
Image returnImage = Image.FromStream(ms);
pcInsurance.Image= returnImage;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
try
{
ms.Flush();
ms.SetLength(0);
ms.Close();
ms.Dispose();
ms = null;
//GC.Collect();
}
catch
{
}
}
第二种方法:
其中 pcinsurance 是我的PictureBox
byte[] byteArray = oDetail.InsuranceCardImage;
var imageStream = new MemoryStream(byteArray);
var image = (Bitmap)Bitmap.FromStream(imageStream);
pcInsurance.Image = image;
仍然无法解决这个问题,
请提供您的解决方案,以便我继续工作
谢谢。
答案 0 :(得分:0)
为什么使用ms.Close();
,ms.Dispose();
和ms = null;
?
您将此流处理两次,然后将其设置为null。
最后始终执行,因此始终处置MemoryStream
。
我怀疑所有资源都是在之前发布的它们被GDI使用。我前段时间遇到过类似的问题。
根据MSDN: http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx
您必须在图像的生命周期内保持流打开。
解决方案是创建Bitmap
对象:
Bitmap bmp = new Bitmap(ms);
this.pcInsurance.Image = bmp;
实际上我使用using
语句来简化代码,在最终括号之前关闭流。工作完全相同,但更短,在我看来更具可读性。
Bitmap
和picturebox.Image
个对象必须先处理。
希望这有帮助。