c# - 即使我将其丢弃,TextureBrush 也会导致内存泄漏

标签 c# memory-leaks gdi+

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

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

嗯,我找到了一个裁剪图片的代码片段C# crop circle in a image or bitmap或:

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;
}

但是代码在第 6 行一段时间后导致内存泄漏。

嗯,我尝试添加 TB.Dispose();来阻止它,但是,这没有帮助。

我应该做什么?

最佳答案

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

SourceImageCroppedImageTBG

FinalImage 不会在此函数中被处置,因为它被返回,但无论使用 FinalImage 都有责任处置它。

正如 PowerRoy 提到的,使用 block 将为您完成处理。

这是一个使用多个 using block 的重构示例:

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;
}

关于c# - 即使我将其丢弃,TextureBrush 也会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619241/

相关文章:

c# - 在这种情况下我应该使用什么正确的数据类型?

c++ - 当跨构造函数边界抛出异常时,borland C++ 编译器不会撤消内存分配?

c# - 有没有办法从表单关闭事件中的所有绑定(bind)元素中删除绑定(bind)?

c# - 如何在图像上绘制透明形状

delphi - GDI+ 和 Delphi、PNG 资源、DrawImage、ColorConversion -> 内存不足

c# - 使用 ASP.NET Web API,我的 ExecutionContext 不在异步操作中流动

c# - 将数据从 UserControl 传递到另一个

c# - 为 Program 类抛出 TypeInitializationException

iphone - nsmutablearray 泄漏内存 iphone

c++ - 使已经绘制的内容透明?