2010-11-29 4 views
4

J'utilise WIALib pour accéder à ma webcam. Le code que je développe est assez simple: quand on appuie sur un bouton, une image webcam est prise, puis affichée dans une boîte d'image.Prendre une photo automatiquement en utilisant une webcam en C# en utilisant WIA

Je peux déjà prendre des photos avec ma webcam, mais elle n'est pas encore entièrement automatisée. La seule manière que je trouvais pour récupérer les photos prises par la webcam, utilise ceci:

wiaPics = wiaRoot.GetItemsFromUI(WiaFlag.SingleImage, WiaIntent.ImageTypeColor) as CollectionClass; 

Mais cela demande à l'utilisateur de sélectionner l'image. Et je veux toujours la dernière photo prise. J'essaie donc de cette façon:

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

Mais la méthode TakePicture() renvoie null, et donc je ne peux pas transférer l'image. La chose la plus étrange est que l'image a été vraiment prise après que la méthode TakePicture() ait été appelée, puisque si je vais à la webcam manuellement l'image est là! Je ne comprends pas pourquoi il ne renvoie pas de valeur.

Pour récapituler, j'ai soit besoin de l'un de ces deux: 1. Obtenez TakePicture() au travail, renvoyant une valeur que je peux utiliser. 2. Accédez automatiquement à la liste des images de la webcam pour pouvoir récupérer la dernière photo prise. Cordialement, merci pour l'aide, Micael.

Répondre

3

D'après ce que je peux voir, wiaItem = wiaRoot.TakePicture() va dans le mauvais sens. Essayez ceci:

string imageFileName; 
wiaRoot.TakePicture(out takenFileName); 
pictureBox1.Image = Image.FromFile(imageFileName); 

TakePicture enregistre une image dans un fichier, et retourne le nom en tant que paramètre de sortie du nouveau fichier.

Éditez par votre commentaire - utilisez-vous la "version Windows 7" de WiaLib? Si oui, essayez quelque chose comme ceci:

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

où vous utilisez le ExecuteCommand avec the well known guid (également exposé de l'emballage COM Interop) plutôt que TakePicture. Cela a fonctionné pour ma webcam, en tout cas.

+0

Merci pour l'aide Philip. La chose est, je reçois l'erreur "Pas de surcharge pour la méthode" TakePicture "prend 1 argument". :( – Micael

+0

@Micael - si vous êtes sur le nouveau, voir si mon edit fonctionnera pour vous –

+0

Je ne connais pas la version de mon WiaLib Je travaille sous Windows XP Pro et Visual Studio 2010. Quand je collé votre code, la classe DeviceManagerClass et Device n'ont pas été reconnus Dois-je ajouter une autre référence, autre que WiaLib Merci encore :) – Micael

Questions connexes