ImageToolsを使用してSilverlightアプリケーション上でGIFを再生する

ImageToolsというライブラリを使用して、Silverlightアプリケーション上でGIFを再生する方法を書きます。

ImageTools 公式サイト
imagetools.codeplex.com

使い方

  1. ImageToolsライブラリをダウンロードする。

上記公式サイトから、ライブラリをダウンロードしてください。


2.Silverlight アプリケーションのプロジェクトにImageToolsのDLLを参照設定する。
 GIFを再生するために必要なDLLはおおよそ以下の4つ。
 ImageTools.dll
 ImageTools.Controls.dll
 ImageTools.Utils.dll
 ImageTools.IO.Gif.dll

3.参照設定後、xamlファイルに以下のように記述する。
 namespaceにImageToolsを追加し、GIFを表示するためのImageToolsのAnimatedImageタグを定義する。

<UserControl x:Class="ImageToolsSampleApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:imagetools="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <imagetools:AnimatedImage x:Name="image" Height="100" Width="100" Stretch="Fill" MouseLeftButtonUp="image_MouseLeftButtonUp"></imagetools:AnimatedImage>
    </Grid>
</UserControl>


4.上記xamlファイルのコードビハインドで以下のように記述する。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using ImageTools;
using ImageTools.IO;
using ImageTools.IO.Gif;

namespace ImageToolsSampleApp
{
    public partial class MainPage : UserControl
    {
        // GIFアニメーションの動いてるか止まっているかを持つフラグ
        private bool isAnimate = false;

        public MainPage()
        {
            InitializeComponent();
            Decoders.AddDecoder<GifDecoder>();

            ExtendedImage extendedImage = new ExtendedImage();

            // GIF読み込み完了時の処理
            extendedImage.LoadingCompleted += (sender, args) =>
            {
                Dispatcher.BeginInvoke(() =>
                {
                    image.Source = extendedImage;
                    isAnimate = true;
                    
                    // GIFの再生秒数を抽出
                    double totalDelayTime = 0F;
                    for (int i = 0; i < extendedImage.Frames.Count; i++)
                    {
                        totalDelayTime += (extendedImage.Frames[i].DelayTime / 100.0) * 1000.0;
                    }
                    totalDelayTime += (extendedImage.DelayTime / 100.0) * 1000.0;
                });
            };

            // GIF読み込み
            extendedImage.UriSource = new Uri("Image/sample.gif", UriKind.Relative);
        }

        // GIFクリック時の処理
        private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            // GIFの状態をみて、再生するか止めるか行う
            if (isAnimate == false)
            {
                image.Start();
                isAnimate = true;
            } else 
            {
                image.Stop();
                isAnimate = false;
            }
        }
    }
}


以上