Monday, May 15, 2006

Capture d'image avec GDI+

Capture d'écran sous Windows

Effectuer des captures d’écrans sous Windows à partir de votre programme est la plupart du temps assez compliqué. Il faut appeler l’api Win32 (fonction bitblt si je ne m’abuse).

Pour appeler les fonctions de l’api il faut utiliser le Plateform Invoke et donc rédiger à la main l’adaptation en .NET des prototypes de fonctions à partir des DLLs de plateformes. On peut toujours aller sur www.Pinvoke.net pour obtenir automatiquement les prototypes. Quoi qu’il en soit moi ça ne me plait pas trop, en effet le PInvoke crée explicitement un appel à une fonction non managée. Je préfère me contenter d’écrire du code managé tant que possible.

La solution, appeler GDI+ pour effectuer sa capture. Un petit exemple :

Bitmap memoryImage;
Rectangle rc = Screen.PrimaryScreen.WorkingArea;
memoryImage = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
using (Graphics memoryGrahics = Graphics.FromImage(memoryImage))
{
memoryGrahics.CopyFromScreen(rc.X, rc.Y,0, 0, rc.Size, CopyPixelOperation.SourceCopy);

}

Et voila vous obtenez votre bitmap dans memoryImage, un bitmap facile à enregistrer dans un fichier, ou à mettre dans un picturebox. Vous pouvez même effectuer un thumbnail grâce à Bitmap.GetThumbnailImage().



--------------------------------------------------------------------------------


Le problème

Si vous essayez de faire une capture d’une vidéo vous risquez d'avoir un problème, il est possible que la vidéo soit en overlay sur la couche GDI+. Auquel cas vous ne récupérerez qu’un carré noir à sa place.

C’est un phénomène que je ne suis pas encore capable d’expliquer en détail (encore un sujet sur lequel il faut que je me renseigne ), cependant j’ai deux solutions à vous proposer pour l’instant :

Désactiver l’accélération matérielle de votre lecteur vidéo
Ouvrir deux lectures vidéo, la première est affichée en overlay tandis que la deuxième s’affichera bien sur la couche GDI+

1 comment:

Anonymous said...

Your site is on top of my favourites - Great work I like it.
»