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

C# 使用WIA在C中使用网络摄像头自动拍照,c#,webcam,wia,C#,Webcam,Wia,我正在使用WIALib访问我的网络摄像头。我正在开发的代码非常简单:当按下按钮时,会拍摄一张网络摄像头的图片,然后显示在图片框中 我已经可以用我的网络摄像头拍照了,但它还没有完全自动化。我发现检索网络摄像头拍摄的照片的唯一方法是使用以下方法: wiaPics = wiaRoot.GetItemsFromUI( WiaFlag.SingleImage, WiaIntent.ImageTypeColor ) as CollectionClass; 但这要求用户选择图片。我总是想拍最后一张照片。所以

我正在使用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将图片保存到文件中,并将新文件的名称作为输出参数返回

根据您的评论进行编辑-您是否使用windows 7版本的WiaLib?如果是这样,请尝试以下方法:

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时,还可以从COM互操作包装中公开,而不是从TakePicture中公开。无论如何,它对我的网络摄像头起作用。

谢谢你的帮助。问题是,我得到了TakePicture takes 1参数错误的No重载:@如果你在更新版本,看看我的编辑是否适合你。我不知道我的WiaLib的版本。我在WindowsXP Pro和VisualStudio2010下工作。粘贴代码时,无法识别DeviceManager类和设备。除了WiaLib,我还需要添加其他参考吗?再次感谢:@Micael请确保您正在向Windows Image Acquisition Library 2.0添加COM引用。设备应位于WIA名称空间中-确保您已使用WIA。然后您应该能够找到WIA.DeviceManager类。嗯,我想我没有使用WIA的windows 7版本,因为我只有Microsoft windows Image Acquisition 1.01类型库。