2012-01-25 24 views
0

我正在看一个用C#编写的小图像裁剪和调整大小库。它由一个具有静态方法的单个静态类组成,用于调整大小和裁剪功能。我是否需要处理静态类的静态方法中使用的位图实例?

例如裁剪方法:

public static Image Crop(Image img, Rectangle cropArea) 
{ 
    var bmpImage = new Bitmap(img); 
    var bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); 
    return bmpCrop; 
} 

我知道,通常情况下,位图对象需要进行处置,以防止内存泄漏,但是这是因为类是静态的不同呢?

我不想要实现这个库,并运行到内存问题的道路

回答

3

首先,当使用位图时,如果您在任何时候希望使用多个线程,我都会警告不要使用静态类。一次不能有多个线程使用位图。

using(Graphics g = Graphics.FromImage(bmpCrop) 
{ 
    // do something 
} 

,并在另一个

int w = bmpCrop.Width 

你会得到一个无效的参数异常:因此,例如,如果你下次在一个线程中这样做。

接下来,在你的榜样,我看到三个镜像实例...

  • IMG
  • bmpImage
  • bmpCrop

现在你是不是在这个功能配置bmpImage并需要。 在此通话之后,呼叫者有责任在某个时刻处理img和bmpCrop

1

静态的不改变处置的要求(作为一般规则)。你必须考虑的是,在之后,将使用Bitmap静态方法已完成。因此,例如,如果您将Bitmap退回到您的函数之外,那么您不希望处理它,因为您期望其他人(某些其他代码)需要使用它,所以它成为他处置它的责任。

但是,方法本身是静态的这一事实没有任何影响,如果您将其置于非静态方法中,则应该使用静态方法处理它。

相关问题