Du Gif pour Silverlight !

J’ai lu il y a quelques jours le billet d’un blog qui expliquait comment intégrer un GIF dans WP7 en utilisant un WebBrowser (!). Heureusement il existe une solution plus élégante qui permet une bonne intégration dans Silverlight aussi bien coté Web que mobile. Cette solution c’est la librairie ImageTools de Sebastian Stehle que vous pouvez télécharger sur CodePlex. Ne vous fiez pas à l’erreur Silverlight sur la page d’accueil du projet, la librairie fonctionne très bien. Elle permet de lire et parfois d’écrire dans les formats png, jpeg et bien sur gif (lecture seule).
Pour notre test, j’ai crée un projet WP7 dans lequels j’ai ajouté les assemblies suivant de la branche Phone de la librairie :

- ImageTools
- ImageTools.Controls
- ImageTools.IO.Gif

Coté XAML, on utilise le contrôle AnimatedImage inclus dans ImageTools.Controls. Celui ci permet d’afficher un gif en utilisant éventuellement sa transparence, voire ses animations !

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <controls:Pivot>
                <controls:PivotItem Header="transparence">
                    <my:AnimatedImage AnimationMode="None" x:Name="ImageGif89a"/>
                </controls:PivotItem>
                <controls:PivotItem Header="animation">
                    <my:AnimatedImage x:Name="ImageGif89aAnimated"/>
                </controls:PivotItem>
            </controls:Pivot>
        </Grid>

Coté CodeBehind, c’est très simple puisque l’on charge le fichier, on le décode vers une classe Image spécifique que le controle AnimatedControl sait lire :

        /// <summary>
        /// Chargement de l'image
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>

        public ExtendedImage LoadImage(string uri)
        {
	    // Chargement de l'image en ressource
            Stream stream = Application.GetResourceStream(new Uri(uri, UriKind.Relative)).Stream;

            // Création de l'image
            ExtendedImage image = new ExtendedImage();

            // Décodage et transfert dans l'image
            GifDecoder decoder = new GifDecoder();
            decoder.Decode(image, stream);

            return image;
        }

        /// <summary>
        /// Chargement
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            ExtendedImage imageChomp = this.LoadImage("Images/Test89a.gif");

            this.ImageGif89a.Source = imageChomp;
            this.ImageGif89aAnimated.Source = imageChomp;
        }

Le rendu est le suivant :

En faisant des tests avec plusieurs format de gifs (89a, 87a, interlace,..), j’ai constaté qu’une image n’a pas réussit à s’afficher. Je pensais que la version du format gif (87a) était impliquée dans l’histoire mais après contacts avec l’auteur, il semble que cela soit due à certains formats utilisant la technique d’entrelacement. Heureusement, ce format n’est presque plus utilisé et ne devrait donc pas vous poser trop de problème.

Vous pouvez télécharger le projet ici !

2 réponses à Du Gif pour Silverlight !

  1.  

    Pour ma part, j’ai constaté que pas mal de gifs ne se chargeaient pas
    Je reste sur ma faim

  2. Salut Nico,
    L’auteur m’a confirmé que les GIFs qui ne s’affichent pas sont liés au format mettant en scène l’interlace. Pour avoir moi même codé une routine d’affichage de GIF, cette partie n’est pas forcément la plus simple à appréhender. Je conviens que cela peut être génant. Espéront que l’auteur trouve un peu de temps pour corriger cela. En attendant sa librairie vaut vraiment le coup. Tout dépend de ce que l’on veut en faire :)

     

leave your comment