【问题标题】:A Generic error occured in GDI+ on Server Machine服务器计算机上的 GDI+ 中发生一般错误
【发布时间】:2013-08-14 17:26:01
【问题描述】:

我尝试了许多解决方案来删除 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 是我的图片框

byte[] byteArray = oDetail.InsuranceCardImage;
var imageStream = new MemoryStream(byteArray);
var image = (Bitmap)Bitmap.FromStream(imageStream);
pcInsurance.Image = image;

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

【问题讨论】:

  • 你的意思是第二种方法也会报错吗?你用第二种方法处理内存流吗?
  • 是的第二种方法也给出了错误。不,我没有在第二种方法上处理内存流
  • 尝试将 MemoryStream 从方法移动到类字段,我猜 GC 会在渲染时处理它...
  • 我已经试过了。这就是我评论这条 GC 行的原因。
  • 我的意思是在第二种方法中,第一种方法不起作用,因为您无法处理某些位图正在使用的流......很清楚为什么第一种方法不起作用......您是否尝试使用第二种方法并将流作为字段移到外部?

标签: c# .net image visual-studio-2010 gdi


【解决方案1】:

您为什么使用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 语句来简化代码,在最后的大括号之前关闭流。工作原理完全相同,但更短,在我看来更具可读性。

Bitmappicturebox.Imageobjects 必须在设置另一张图片之前进行处理。

希望这会有所帮助。

【讨论】:

  • 我应该删除这些行吗? ms.Close();, ms.Dispose(); , ms = null;, ms.Flush();, ms.SetLength(0);?
  • 正如我之前所说的,你处理流的速度太快了。
  • 我删除了 finally 块并添加了你的两行并删除了 Image returnImage = Image.FromStream(ms);
  • 这是朝着好的方向迈出的一步。我还建议您查看 MSDN 以充分了解您这样做的原因。
  • 好的,它可以将图像转换为字节,但你能告诉我将字节转换为不显示 GDI+ 错误的图像吗?
猜你喜欢
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2019-09-25
  • 2010-12-12
相关资源
最近更新 更多