1

我尝试了许多解决方案来删除 GDI + 中发生的一般错误,但对我没有任何作用,我发布了我使用过的代码。这个错误发生在服务器机器
图像字节成功存储在数据库中,但没有在 PictureBox 上检索。

第一种方法:
ODetail.InsuranceCardImages包含来自数据库的图像字节
pcinsurance是我的图片框

                    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;

仍然无法解决此问题,
请提供您的解决方案,以便我继续我的工作
谢谢。

4

1 回答 1

0

你为什么使用ms.Close();,ms.Dispose();ms = 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必须在设置另一张图片之前处理对象。

希望这可以帮助。

于 2013-08-13T08:27:26.077 回答