我正在使用简单的库来使用我的网络摄像头(使用Aforge.net)。目前我正在创建从相机中获取单张照片的方法。以下是我的代码示例:
private Bitmap img = new Bitmap(10,10);
// start camera
public void StartCam( int ind)
{
cam = new VideoCaptureDevice(videoDevices[ind].MonikerString);
cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
cam.Start();
}
// new frame event
void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
lock (img)
{
if (img != null)
img.Dispose();
img = (Bitmap)eventArgs.Frame.Clone();
}
}
// return picture method
public Bitmap MakePicture()
{
return new Bitmap(img);
}
我的问题是我不时会在此行中ArgumentException was Unhandled
- Parameter was Invalid
return new Bitmap(img);
但是在异常时img
似乎没问题,简单的位图640x480(不是那么大)。我一直在网上搜索,发现它可能是一些内存问题(我是32位),但是当发生这种情况时我的整个过程不会超过150MB。
你知道是什么原因造成这种情况以及如何避免这种情况吗?
感谢您的帮助!
编辑:
lock
不是问题 - 如果没有它也会发生img
in not null
Thread.Sleep()
img.Dispose()
之后我也得到了这个ArgumentException,但这次我真的可以在监视列表中看到所有img
参数都是无效的...... img
似乎一切正常......我现在唯一想到的就是那个当我在其他线程中处理时,我正在调用img
。但我不知道如何防止这种情况发生。答案 0 :(得分:1)
有时调试器可能是错误的(即使不太可能)。你试过addind一个空检查只是为了谨慎吗?
// return picture method
public Bitmap MakePicture()
{
Bitmap res = null;
if (img != null)
res = new Bitmap(img);
return res;
}
但我不认为这是问题所在。我敢打赌你的img对象在你调用MakePicture()方法时被锁定了。 您可以尝试通过在锁内添加thread.Sleep()来重现此操作。如果问题实际上来自锁,您可能想要使用不同的模式。