ImageToolsを使用してSilverlightアプリケーション上でGIFを再生する
ImageToolsというライブラリを使用して、Silverlightアプリケーション上でGIFを再生する方法を書きます。
ImageTools 公式サイト
imagetools.codeplex.com
使い方
- 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; } } } }
以上