我正在使用 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. 自动访问网络摄像头的图片列表,这样我就可以检索最后拍摄的照片。
谨致问候并感谢您的帮助,迈克尔。
据我所见,wiaItem = wiaRoot.TakePicture()
正在走上错误的道路。尝试这个:
string imageFileName;
wiaRoot.TakePicture( out takenFileName);
pictureBox1.Image = Image.FromFile(imageFileName);
TakePicture 保存图片到一个文件,并返回新文件的名称作为输出参数。
Edit根据您的评论 - 您是否使用 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 的地方众所周知的指南 http://msdn.microsoft.com/en-us/library/ms630806(也从 COM 互操作包装器公开)而不是 TakePicture。无论如何,它对我的网络摄像头有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)