0

嗨,我有一个应用程序,每当按下按钮时,我都必须保存来自三个不同 IP 摄像机的图像。

我正在使用一个类,该类具有从 IP 摄像机保存图像所需的所有成员,即 BitmapImage 和保存照片时的 DateTime。

我有以下问题。我需要每隔几百毫秒保存每个相机的一定数量的照片。我目前正在测试它,每 200 毫秒将每个相机的 50 张照片保存到 ConcurrentQueue,然后将项目从 ConcurrentQueue 保存到文件中。在我为所有三个相机拍摄了大约 110 张照片后,它只会保存空白图像。

我认为我的问题是程序内存太满了,所以当我使用 ConcurrentQueue 的 TryDequeue() 方法保存项目时,我需要从内存中清除项目。

谁能给我建议或给我一些链接,可以帮助我解决这个问题,这样我就可以为每台相机保存尽可能多的照片,并且在一定数量的照片后它不会耗尽内存?

按下一个按钮,然后它进入一个 for 循环,在该循环中调用以下方法。

private void EnqueuePhotos1()
    {
        IPCamera1 ipCam1Enqueue = new IPCamera1();
        BitmapImage cam1Image = new BitmapImage();
        cam1Image.BeginInit();
        cam1Image.CacheOption = BitmapCacheOption.OnLoad;
        cam1Image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        cam1Image.UriSource = null;
        cam1Image.UriSource = new Uri("http://" + ipCam1IP + "/image?res=full&x0=0&y0=0&x1=1600&y1=1200&quality=21&doublescan=0", UriKind.Absolute);
        while (cam1Image.IsDownloading) { ; }
        cam1Image.EndInit();
        ipCam1Enqueue.IPCamImage = cam1Image;
        ipCam1Enqueue.TimeTook = DateTime.Now;
        ipCam1ConQ.Enqueue(ipCam1Enqueue);
    }

一定次数,具体取决于用户想要拍摄的照片数量。

就在 for 循环之前,我启动计时器以每 100 毫秒检查一次 ConcurrentQueue 上是否有内容,然后如果找到内容,它会调用以下函数。

private void GetPhotos1()
    {
        IPCamera1 ipCam1Dequeue = new IPCamera1();
        while (ipCam1ConQ.TryDequeue(out ipCam1Dequeue))
        {
            cam1Photos++;
            cam1ImgLoc = cam1Location + "\\Image " + cam1Photos + ".jpg";
            FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create);
            JpegBitmapEncoder cam1Encoder = new JpegBitmapEncoder();
            cam1Encoder.Frames.Add(BitmapFrame.Create(ipCam1Dequeue.IPCamImage));
            cam1Encoder.Save(cam1Stream);
            cam1Stream.Dispose();
        }
    }
4

1 回答 1

1
using (FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create))
{
    // do stuff...
}

以这种方式定义的资源会在 using 语句中的语句执行后自动释放。

于 2013-06-05T09:56:21.227 回答