使用WIA在C#中使用网络摄像头自动拍照

时间:2010-11-29 18:45:19

标签: c# webcam wia

我正在使用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。

1 个答案:

答案 0 :(得分:3)

从我所看到的情况来看,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与the well known guid一起使用(也是从COM互操作包装器中公开)而不是TakePicture。无论如何,它适用于我的网络摄像头。