TextureBrush导致内存泄漏,即使我处理它

Fat*_*KIR 2 c# gdi+ memory-leaks

我正在开发一个圆形菜单应用程序.

在我使用位图作为背景之前,我必须将其裁剪为圆形.

好吧,我找到了一个代码片段,用于在图像或位图中裁剪图片C#裁剪圆圈或:

public System.Drawing.Image x(string sourceFile, int circleUpperLeftX, int circleUpperLeftY, int circleDiameter)
{
    Bitmap SourceImage = new Bitmap(System.Drawing.Image.FromFile(sourceFile));
    Rectangle CropRect = new Rectangle(circleUpperLeftX, circleUpperLeftY, circleDiameter, circleDiameter);
    Bitmap CroppedImage = SourceImage.Clone(CropRect, SourceImage.PixelFormat);
    TextureBrush TB = new TextureBrush(CroppedImage);
    Bitmap FinalImage = new Bitmap(circleDiameter, circleDiameter);
    Graphics G = Graphics.FromImage(FinalImage);
    G.FillEllipse(TB, 0, 0, circleDiameter, circleDiameter);
    return FinalImage;
}
Run Code Online (Sandbox Code Playgroud)

但是在第6行中,代码会导致内存泄漏一段时间.

好吧,我尝试添加TB.Dispose(); 但是,这没有帮助.

我该怎么办?

Lar*_*ech 5

您需要处理实现的所有内容IDispose,并查看您的代码,它看起来像:

SourceImage,CroppedImage,TB,G

FinalImage因为它被退回,所以不会被置于此功能中,但是无论使用什么FinalImage都有责任处理它.

正如PowerRoy所提到的,使用块将为您处理.

以下是使用多个使用块的重构示例:

public Image CreateFinalImage(string sourceFile, int circleUpperLeftX, int circleUpperLeftY, int circleDiameter) {
  Bitmap finalImage = new Bitmap(circleDiameter, circleDiameter);
  Rectangle cropRect = new Rectangle(circleUpperLeftX, circleUpperLeftY, circleDiameter, circleDiameter);

  using (Bitmap sourceImage = new Bitmap(System.Drawing.Image.FromFile(sourceFile)))
  using (Bitmap croppedImage = sourceImage.Clone(cropRect, sourceImage.PixelFormat))
  using (TextureBrush tb = new TextureBrush(croppedImage))
  using (Graphics g = Graphics.FromImage(finalImage)) {
    g.FillEllipse(tb, 0, 0, circleDiameter, circleDiameter);
  }

  return finalImage;
}
Run Code Online (Sandbox Code Playgroud)