嗨,我有一个应用程序,每当按下按钮时,我都必须保存来自三个不同 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();
}
}