我正在写一个.dll,我正在使用以下方法:
public static Bitmap Merge(Bitmap largeBmp, Bitmap smallBmp)
{
Bitmap bitmap = new Bitmap(largeBmp.Width + smallBmp.Width, Math.Max(largeBmp.Height, smallBmp.Height));
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawImage(largeBmp, 0, 0);
g.DrawImage(smallBmp, largeBmp.Width, 0);
}
return bitmap;
}
我想知道如果多次调用此方法(比方说10000次)会导致内存问题。如果是,我该如何避免呢?我是否必须在dispose
对象上拨打bitmap
?
编辑:我在while
语句中以这种方式调用该方法:
writerOut.WriteVideoFrame(Merge(lastFrame, lastColorFrame));
如何处置从Bitmap
方法返回的Merge
(在我使用它之后)?
答案 0 :(得分:9)
当您返回调用者要使用的位图时 - 调用者有责任在对象完成后处置它。
通过使用'using'语句,您已经尽力确保图形对象得到妥善处理。理论上你应该没问题 - 我不担心,除非它成为一个特定的问题 - 然后再回来询问如何解决它。
关于你的编辑 - 除非'writerOut.WriteVideoFrame'在完成它时处理bimtap然后这会导致问题。
你可以这样做:var bm = Merge( ... );
writerOut.WriteVideoFrame(bm);
bm.Dispose();
或
using(var bm=merge(...))
writerOut.WriteVideoFrame(bm)
答案 1 :(得分:3)
Bitmap
实例需要在使用后处理。最简单的方法是using
块:
using (var bmp = Merge(lastFrame, lastColorFrame)) {
writerOut.WriteVideoFrame(bmp);
}
using
阻止是在try-finally
部分调用Dispose
的{{1}}阻止的简写,因此即使在finally
期间发生异常,位图将被正确处理。