如何解决这个潜在的处置相关文件覆盖问题?

时间:2010-02-25 19:05:22

标签: c# .net image gdi dispose

我正在加载一个50x50的Bitmap文件,然后在程序启动时填充一个随机颜色。然后将结果保存到同一文件并将其分配给PictureBox,但遇到文件写入问题和“GDI +中发生一般错误”等。

如何正确地执行此操作以便我可以不断重复此操作,(打开位图,将其绘制为随机颜色,保存并分配给picturebox.Image)?

编辑:

  public Form1 ( )
  {
   InitializeComponent ( );

   //Bitmap bmp = new Bitmap ( 50, 50 );
   Bitmap bmp = new Bitmap ( @"C:\temp\pretty.bmp" );

   Graphics g = Graphics.FromImage ( bmp );
   Brush b = new SolidBrush ( Color.Red );
   g.FillRectangle ( b, 0, 0, 49, 49 );
   bmp.Save ( @"C:\temp\pretty.bmp" );

   this.pictureBox1.Image = ( Image ) bmp.Clone ( );
   //bmp.Dispose ( );
  }

3 个答案:

答案 0 :(得分:3)

使用正确的using s进行简单的调整,如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    Bitmap bmp2;

    using (Bitmap bmp1 = new Bitmap(@"C:\temp\pretty.bmp"))
    {
//Edit: Clone was keeping a link between bmp1 and bmp2 somehow
       // bmp2 = (Bitmap)bmp1.Clone();
       IntPtr hbmp = bmp1.GetHbitmap();
       bmp2 = Bitmap.FromHbitmap(hbmp);     
    }

    using (Graphics g = Graphics.FromImage(bmp2))
    using (Brush b = new SolidBrush(Color.Red))
    {
        g.FillRectangle(b, 0, 0, 49, 49);

        bmp2.Save(@"C:\temp\pretty.bmp");
    }

    this.pictureBox1.Image = bmp2;   
}

答案 1 :(得分:2)

当您使用带有路径参数的Bitmap构造函数时,它会保持文件处于打开状态,直到您释放Bitmap为止。您需要从Stream加载位图,然后关闭Stream以关闭文件。这应该可以正常工作:

public Form1 ( )
{
    InitializeComponent ( );

     Bitmap bmp = null;
     using (Stream stream = File.OpenRead(@"C:\temp\pretty.bmp"))
     {
         bmp = new Bitmap(stream);
     }

     using (Graphics g = Graphics.FromImage ( bmp ))
     using (Brush b = new SolidBrush ( Color.Red ))
     {
         g.FillRectangle ( b, 0, 0, 49, 49 );
     }
     bmp.Save ( @"C:\temp\pretty.bmp" );
     this.pictureBox1.Image = bmp;
}

答案 2 :(得分:1)

喔。您需要为每个图像使用不同的文件,否则您将覆盖第一个图像。事情是,只有在实际需要时才可以读取图像。

另一种选择是将图像存储在内存流中,而不是存储在文件中。