在C#应用程序中处理位图

时间:2014-02-24 12:33:51

标签: c# .net bitmap dispose using

我正在写一个.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(在我使用它之后)?

2 个答案:

答案 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期间发生异常,位图将被正确处理。