4

我正在使用 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. 自动访问网络摄像头的照片列表,这样我就可以检索到最后一张照片。

最好的问候和感谢您的帮助,米卡尔。

4

1 回答 1

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);
    }
}

在哪里使用带有众所周知的 guid(也从 COM 互操作包装器中公开)而不是 TakePicture 的 ExecuteCommand。无论如何,它适用于我的网络摄像头。

于 2010-11-30T22:09:55.020 回答