为什么如果我只为一个摄像头调用 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);
因为位图是图像
顺便说一句,您可以按图片框大小缓存图像并重复使用它直到调整大小。
我在图片框中显示了我从两个相机拍摄的图像(两者都相同)。每个相机图像显示在图片框的不同 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);
因为位图是图像
顺便说一句,您可以按图片框大小缓存图像并重复使用它直到调整大小。