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(); 但是,这没有帮助.
我该怎么办?
您需要处理实现的所有内容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)