嗨我有一个应用程序,只要按下按钮,我就必须从三个不同的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循环之前,我启动计时器检查每100ms是否在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();
}
}
答案 0 :(得分:1)
using (FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create))
{
// do stuff...
}
以这种方式定义的资源在执行using语句中的语句后自动处理。