Silverlight 3 offre maintenant la possibilité de travailler avec des bitmaps en mémoire. Cette fonctionnalité offre de nombreux avantages pour constituer en arrière plan une image de manière programmatique. Il est alors possible de changer très rapidement des images à la volée pour obtenir des effets visuels particuliers, transformer un visuel ou encore de texturer une surface 3D.
Mais une autre utilisation est de pouvoir capturer l’écran d’une application Silverlight et pourquoi pas de la sauvegarder par la suite sur le disque ou de l’envoyer via une connexion Web. Pour ce faire, il convient dans un premier temps de créer une image modifiable en instanciant la classe WriteableBitmap de l’espace de nom System.Windows.Media.Imaging avec la taille de l’image souhaitée.
WriteableBitmap wb = new WriteableBitmap(800, 600, PixelFormats.Pbgra32);
La classe WriteableBitmap permet alors d’accéder à chaque pixel de l’image au travers d’un tableau d’entiers. Mais elle dispose aussi d’une méthode Render qui prends deux paramètres : un élément visuel et une transformation à appliquer.
Grâce à cette méthode, il est alors possible de capturer le visuel d’un élément quelconque de Silverlight. Par contre, du à un bug de la béta actuelle (enfin je pense), il est obligatoire de fournir une transformation même si on ne désire pas en appliquer une.
Voici un exemple qui capture le conteneur le plus haut (donc le rendu complet de l’écran) et qui affiche le contenu avec une rotation de 20° dans un composant image du même écran.
WriteableBitmap wb = new WriteableBitmap(800, 600, PixelFormats.Pbgra32); wb.Render(LayoutRoot, new RotateTransform() { Angle = 20 }); image1.Stretch = Stretch.Uniform; image1.Source = wb;
Pour ne pas avoir de transformation, il suffit de mettre l’angle de rotation à 0. Ce bug sera certainement corrigé dans la version définitive car le prototype de la méthode accepte normalement la valeur null.