我正在开发一个圆形菜单应用程序。
在使用位图作为背景之前,我必须将其裁剪为圆形。
嗯,我找到了一个裁剪图片的代码片段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
的所有内容,并查看您的代码,它看起来像:
SourceImage
、CroppedImage
、TB
、G
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/