使用WIA在C#中使用网络摄像头自动拍照
我正在使用WIALib来访问我的网络摄像头。 我正在开发的代码非常简单:当按下按钮时,会拍摄网络摄像头图像,然后显示在图片框中。
我已经可以用我的网络摄像头拍照了,但它还没有完全自动化。 我发现检索网络摄像头拍摄的照片的唯一方法是使用:
wiaPics = wiaRoot.GetItemsFromUI( WiaFlag.SingleImage, WiaIntent.ImageTypeColor ) as CollectionClass;
但是这要求用户选择图片。 我总是想要拍下最后一张照片。 所以我正在尝试这种方式:
string imageFileName = Path.GetTempFileName(); // create temporary file for image wiaItem = wiaRoot.TakePicture(); // take a picture Cursor.Current = Cursors.WaitCursor; // could take some time this.Refresh(); wiaItem.Transfer(imageFileName, false); // transfer picture to our temporary file pictureBox1.Image = Image.FromFile(imageFileName); // create Image instance from file Marshal.ReleaseComObject(wiaItem);
但是方法TakePicture()返回null,所以我无法传输图像。 最奇怪的是,在调用方法TakePicture()之后,图片才真正被拍摄,因为如果我手动进入网络摄像头,图片就在那里! 我只是不明白它为什么不返回值。
总结一下,我要么需要这两个中的一个:1。让TakePicture()工作,返回一个我可以使用的值。 2.自动访问网络摄像头图片列表,以便检索最后拍摄的图片。
最诚挚的问候和感谢帮助,Micael。
从我所看到的, wiaItem = wiaRoot.TakePicture()
走错了路。 试试这个:
string imageFileName; wiaRoot.TakePicture( out takenFileName); pictureBox1.Image = Image.FromFile(imageFileName);
TakePicture将图片保存到文件中 ,并将新文件的名称作为输出参数返回。
根据您的评论进行编辑 – 您使用的是WiaLib的“Windows 7版本”吗? 如果是这样,尝试这样的事情:
var manager = new DeviceManagerClass(); Item wiaItem; Device device = null; foreach (var info in manager.DeviceInfos) { if (info.DeviceID == DESIRED_DEVICE_ID) { device = info.Connect(); wiaItem = device.ExecuteCommand(CommandID.wiaCommandTakePicture); } }
你将ExecuteCommand与众所周知的guid (也是从COM互操作包装器中公开)而不是TakePicture一起使用。 无论如何,它适用于我的网络摄像头。
上述就是C#学习教程:使用WIA在C#中使用网络摄像头自动拍照分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1038893.html