【问题标题】:Take a picture automatically using a webcam in C# using WIA使用 WIA 在 C# 中使用网络摄像头自动拍照
【发布时间】:2010-11-29 18:45:18
【问题描述】:

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

【问题讨论】:

    标签: c# webcam wia


    【解决方案1】:

    据我所知,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。无论如何,它适用于我的网络摄像头。

    【讨论】:

    • 感谢菲利普的帮助。问题是,我收到“方法“TakePicture”没有重载需要 1 个参数”错误。 :(
    • @Micael - 如果您使用的是较新版本,请查看我的编辑是否适合您。
    • 我不知道我的 WiaLib 的版本。我在 WindowsXP Pro 和 Visual Studio 2010 下工作。当我粘贴您的代码时,无法识别类 DeviceManagerClass 和 Device。除了 WiaLib,我是否需要添加其他参考?再次感谢:)
    • @Micael 确保将 COM 引用添加到“Windows Image Acquisition Libarary 2.0”。 Device 应该在 WIA 命名空间中 - 确保你有 using WIA。然后您应该能够找到WIA.DeviceManagerClass
    • 好吧,我想我没有使用 Windows 7 版本的 WIA,因为我只有“Microsoft Windows Image Acquisition 1.01 Type Library”。
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多