为什么如果我只为一个摄像头调用 pictureBoxPreview1.Image.Dispose(),内存使用量会激增?

Why if I call pictureBoxPreview1.Image.Dispose() for only one camera, memory usage spikes?

我在图片框中显示了我从两个相机拍摄的图像(两者都相同)。每个相机图像显示在图片框的不同 ROI 中。

我的问题是应用程序使用的内存不断增加,很可能是我缺少释放一些资源,但我找不到我缺少的东西。

这是代码:

// bitmap: input new image
// srcRoi: a rectangle with the ROI for the input image
// dstRoi: a rectangle with the ROI for the pictureBox
// reset: true for the first camera, false for the second one.
if (reset)
{
    pictureBoxPreview1.Image.Dispose();
}
if (pictureBoxPreview1.Image == null || reset)
{
    pictureBoxPreview1.Image = new Bitmap(pictureBoxPreview1.Width,
        pictureBoxPreview1.Height);
}
using (Graphics g = Graphics.FromImage(pictureBoxPreview1.Image))
{
    using (var img = Image.FromHbitmap(bitmap.GetHbitmap()))
    {
        g.DrawImage(img, dstRoi, srcRoi, GraphicsUnit.Pixel);
    }
}
if (reset) {
    pictureBoxPreview1.Invalidate();
}

如果pictureBoxPreview1.Image.Dispose()同时调用两个摄像头,则不会出现问题,但每次只显示一个摄像头的图像。

我不明白为什么如果我只创建一个新图像并为一半的图像处理它,那么当对所有图像执行相同的操作时问题就解决了。

您可以按照下面的答案link WPF CreateBitmapSourceFromHBitmap() memory leak

简而言之 bitmap.GetHbitmap() 正在泄漏,必须处理掉

顺便说一句,如果您的位图是 System.Drawing.Bitmap,您可以只写

g.DrawImage(bitmap, dstRoi, srcRoi, GraphicsUnit.Pixel);

因为位图是图像

顺便说一句,您可以按图片框大小缓存图像并重复使用它直到调整大小。