为什么如果我调用pictureBoxPreview1.Image.Dispose()只有一个相机,内存使用峰值

本文关键字:相机 有一个 内存 调用 如果 pictureBoxPreview1 Image Dispose 为什么 | 更新日期: 2023-09-27 17:49:39

我正在展示从图片框中的两台相机捕获的图像(两者相同)。每个相机图像显示在图片框的不同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()调用两个相机,问题不会发生,但每次只显示一个相机的图像。

我不明白为什么,如果我只是创建一个新的图像,并处理它的一半的图像问题解决时,同样的事情是为所有的图像。

为什么如果我调用pictureBoxPreview1.Image.Dispose()只有一个相机,内存使用峰值

您可以从以下链接查看答案WPF createbitmapsourcefrombitmap()内存泄漏

简单地说,bitmap.GetHbitmap()正在泄漏,必须处理

如果你的位图是System.Drawing.Bitmap你可以直接写

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

因为位图是图像

顺便说一句,你可以缓存你的图片框大小和重用它,直到调整大小。