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

问题描述 投票:3回答:2

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

c# .net bitmap dispose using
2个回答
9
投票

当您返回调用者要使用的位图时 - 调用者有责任在对象完成后处置它。

通过使用'using'语句,您已经尽力确保图形对象得到妥善处理。理论上你应该没事 - 我不担心,除非它成为一个特定的问题 - 然后回来问如何解决它。

关于你的编辑 - 除非'writerOut.WriteVideoFrame'在完成它时处理bimtap然后这将导致问题。

你可以这样做:

var bm = Merge( ... );
writerOut.WriteVideoFrame(bm);
bm.Dispose();

要么

 using(var bm=merge(...))
     writerOut.WriteVideoFrame(bm)

3
投票

Bitmap实例需要在使用后处理。最简单的方法是使用using块:

using (var bmp = Merge(lastFrame, lastColorFrame)) {
    writerOut.WriteVideoFrame(bmp);
}

using块是在try-finally部分调用Disposefinally块的简写,所以即使在WriteVideoFrame期间发生异常,位图也将被正确处理掉。

© www.soinside.com 2019 - 2024. All rights reserved.