Ces deux derniers jours, j'ai cherché un moyen de capturer une image de la webcam en utilisant C #. Je suis assez nouveau en c # et je ne veux pas utiliser de bibliothèques tierces externes, j'ai donc trouvé deux bonnes façons, mais les deux semblent renvoyer presque la même erreur. Je ne pouvais pas faire travailler l'un d'entre eux, donc ce serait vraiment bien si vous m'aidiez à faire fonctionner l'un d'eux ou m'aidiez à trouver une alternative.
Donc, la première façon que j'ai trouvée est d'utiliser Windows WIA. J'ai trouvé le code suivant:
CommonDialogClass dialog = new CommonDialogClass();
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
// take the photo
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture);
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG);
// filename and saving
image.SaveFile("Test.jpg");
ce code semble être exactement ce que je recherche, mais je ne peux pas le faire fonctionner, car j'obtiens l'erreur suivante sur la deuxième ligne:
Exception from HRESULT: 0x80210015
La deuxième manière que j'ai trouvée utilise l'Avicap32.dll avec l'exemple suivant:
http://www.timvw.be/wp-content/code/csharp/testavicap32.Zip
mais je reçois ce code:
Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture();
image.Save(@"c:\capture.png", ImageFormat.Png);
l'exception suivante: NullReferenceException: référence d'objet non définie sur une instance d'un objet.
Je pense que les deux solutions causent des problèmes car elles ne trouvent pas mon appareil photo, mais je peux utiliser mon appareil photo dans skype sans aucun problème.
J'ai essayé plusieurs approches, et l'approche la plus simple pour moi était Emgu.cv (paquet nuget).
VideoCapture capture = new VideoCapture(); //create a camera capture
Bitmap image = capture.QueryFrame().Bitmap; //take a picture
C'est tout (à partir de la version 3.3.0 de l'API)
Ancienne approche API
Capture capture = new Capture(); //create a camera captue
Bitmap image = capture.QueryFrame().Bitmap; //take a picture
0x80210015
est WIA_S_NO_DEVICE_AVAILABLE
Les API pour travailler avec des caméras Web sont:
Les deux sont des API natives et vous pourriez avoir du mal à les interfacer directement à partir du code C #, cependant avec DirectShow.NET (en particulier) et Media Foundation.NET, vous avez des wrappers pour le code managé. Vous pouvez trouver plus d'informations sur l'utilisation de DirectShow.NET ici:
Je recommande framework Aforge.net .
Il a pu implémenter classe videoCaptureDevice utilisé dans l'exemple de projet: exemple Snapshot Maker pour créer rapidement une boîte de dialogue de capture d'image. Il est un peu plus lent que Bibliothèque DirectShow - Comment capturer une image à l'aide de la bibliothèque directshow sans afficher les images en direct de la webcam sur la PictureBox ou le pannea mais il est stable et c'est une méthode facile pour définir les résolutions vidéo et d'image à partir de un appareil pris en charge.
Le seul problème que j'ai rencontré est VideoCaptureDevice.SimulateTrigger () utilise un thread bacjground pour créer une image à partir d'un flux vidéo et renvoie l'image sur un événement. Besoin de déléguer la méthode pour éviter les problèmes de threads croisés si vous placez l'image renvoyée sur un contrôle winform sur le thread d'interface utilisateur.
Obtenez la source du projet Snapshot Maker à partir de la source Aforge.net lien SVN .