Générer un bitmap d'une interface graphique en wpf

Description

Depuis le lancement de WPF et Blend, il est possible de mettre en oeuvre des interfaces graphique très riches visuellement. Alors pourquoi utiliser des logiciels de montage vidéo, lorsque une application .Net peut faire tout le travail.

Prenons les exemples suivants :
- Réalisation d'un bulletin télévisuel, dont le contenu correspond à une application...
- Réalisation d'écran plasma pour des halls d'accueil, sans possibilité de déporter l'application...
- Réalisation d'une vidéo AVI à partir de l'écran d'une application...

Comment pourrions nous les réaliser. C'est tout simple :
1- Vous mettez en place une application WPF sous Visual Studio 2008
2- Vous définissez la taille de la fenêtre sur la résolution finale (720x576 pour de la vidéo standard)
3- Vous faîtes votre mise en forme visuelle sous Blend (Microsoft Expression)
4- Vous générez un Bitmap de votre visuel...

Or justement, comment réaliser un Bitmap à partir d'un Canvas et de tous ses UIElements pré-disposés...

C'est très simple il suffit de se tourner vers le nouvel objet du FrameWork Microsoft "RenderTargetBitmap" :

Source / Exemple :


using System.Windows.Media;
using System.Windows.Media.Imaging;
...

private Canvas _displayer = new Canvas();

public Bitmap generateBitmap() 
{
  /* Generer l'interface graphique, avec les UIElements,
  TextBox / Image / Label / Rectangle / etc... 
  et les ajouter au Canvas 

  • /
_displayer.Children.Add(<all_UIElements>); _displayer.UpdateLayout(); /* Affichage en 720x576 */ Bitmap finalImg = new Bitmap(720, 576); this._displayer.Measure(new System.Windows.Size(720.0, 576.0)); this._displayer.Arrange(new System.Windows.Rect(0.0, 0.0, 720.0, 576.0)); RenderTargetBitmap rtbImage = new RenderTargetBitmap( 720, 576, 96, 96, PixelFormats.Pbgra32); /* On realise le rendu du Canvas */ rtbImage.Render(this._displayer); PngBitmapEncoder pngImage = new PngBitmapEncoder(); pngImage.Frames.Add(BitmapFrame.Create(rtbImage)); using (System.IO.MemoryStream mstr = new System.IO.MemoryStream()) { pngImage.Save(mstr); mstr.Flush(); finalImg = new Bitmap(mstr); } return finalImg; } ...

Conclusion :


A partir de cette image, vous avez toutes les possibilités, par exemple :
- L'envoyer via HTTP/FTP pour la mise à jour d'une interface visuelle
- L'intégrer dans un AVI pour en générer une vidéo

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.