WPF - Bitmap d'un Canvas


Il est souvent trés pratique de pouvoir générer un Bitmap directement depuis l'agencement des UIElements d'un Canvas.

1/ Formalisme

Après avoir composé son interface (dans un Canvas), Microsoft a intégré dans son Framework une classe RenderTargetBitmap qui permet d'effectuer un rendu d'une interface graphique pour un stockage dans un Bitmap.

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

private Canvas _displayer = new Canvas();

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

  _displayer.Children.Add();

  _displayer.UpdateLayout();
  /* Affichage en 768x576 */
  Bitmap finalImg = new Bitmap(768, 576);
  this._displayer.Measure(new System.Windows.Size(768.0, 576.0));
  this._displayer.Arrange(new System.Windows.Rect(0.0, 0.0, 768.0, 576.0));
  RenderTargetBitmap rtbImage = new RenderTargetBitmap(
    768,
    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;
}

...

 

2/ Utilisation

1. Pouvoir gérérer un AVI d'une interface graphique.
2. Pouvoir faire une capture d'écran.
3. Etc...

Mise à jour le Vendredi, 21 Août 2009 09:03