何时处理GDI对象,特别是位图

时间:2014-06-23 23:49:06

标签: c# gdi+ dispose

我最近了解到需要处理GDI对象,因为GC不像C#中的其他对象那样处理它们。我有位图,我希望在表格的生命周期内可用,但我不确定一些事情......

  1. 重新创建位图对象时,是否需要先处理原始对象?我想不是,但我以为我会检查。例如:

    // Global
    Bitmap bmp;
    
    // In form constructor...
    bmp = new Bitmap(source);
    
    // In a function...
    if(bmp != null) {
      bmp.Dispose
      bmp = null
    }
    bmp = new Bitmap(source2);
    
    // On paint (if bmp not null)...
    DrawImage(bmp, rectangle);
    
  2. 因为我想在表单的生命周期中保留位图,我可以在表单关闭事件中简单地处理它们吗?

  3. 有没有比保留位图更好的选择?从文件创建每个位图并在paint上处理执行速度太慢。使用Image而不是Bitmap会降低图像质量。

  4. 提前致谢!

1 个答案:

答案 0 :(得分:4)

  1. 您必须致电" Dispose"在这种情况下。不这样做会泄漏旧记忆。
  2. 任何真正需要具有表单生命周期的位图都可以在"关闭"中处理。我不会为每个位图执行此操作,因为您会在内存中同时将很多内容快速占用
  3. 这取决于您的使用案例。如果您正在运行某种动画,那么质量真的需要那么好吗?内存使用与速度。 vs图像质量,只有你知道什么是最重要的。但你不能拥有这三个。
  4. 如果您暂时使用Bitmap,则应考虑将其包裹在using块中,以便自动处理:

    using (Bitmap myBitmap = new Bitmap(src))
    {
      //Do stuff with the temp bitmap
    }