DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ImageAnimatorでのGIFアニメ表示

環境/言語:[Windows XP, VisualStudio 2005, .NET Framework 2.0, C#]
分類:[.NET]

ここに書き込ませていただくのは初めてになりますが、よろしくお願いします。

GIFアニメを表示する
http://dobon.net/vb/dotnet/graphics/animegif.html

この方法でGIFアニメーションを表示しているのですが、
少し動きの速いGIFになるとカクカク表示されてしまいます。
どうもフレーム更新ハンドラが正しいタイミングで呼ばれていない
ようなのですが、これを解決するにはどうすればよいのでしょうか。

例えば←のロボットのアイコンのファイルでも、多少わかりにくくは
ありますが再現しました。
> この方法でGIFアニメーションを表示しているのですが

ご指摘のページでは2つの方法を紹介していますが、「この方法」とは、どちらの方法のことでしょうか?分かりませんので、ImageAnimatorを使った方法と解釈させていただきます。

ピクチャボックスのImageプロパティで表示した時はどうなりますか?Imageプロパティの場合も、内部的にはImageAnimatorを使っていると記憶しておりますので、もしImageでは正常ということになると、ニボシさんのコードに問題がある可能性があります。どちらもだめであれば、もっと根本的な問題ということになるでしょう。
ちょっと試してみましたが、ピクチャボックスのImageプロパティでも確かにきれいに動きませんね。失礼しました。
ニボシさん,こんにちは。

強引なのを承知で提案いたしますが,GIFアニメが一番スムーズに表示されるのは
WebBrowserコントロールだと思います。

Dim ImageFile As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\rob2.gif"
Me.WebBrowser1.ScrollBarsEnabled = False
Me.WebBrowser1.DocumentText = "<body bgcolor=""#" & Hex(Me.BackColor.ToArgb).Substring(2, 6) & """><img src=""" & ImageFile & """></body>"
Do While Me.WebBrowser1.ReadyState < WebBrowserReadyState.Complete
Application.DoEvents()
Loop
Me.WebBrowser1.Size = Me.WebBrowser1.Document.Body.ScrollRectangle.Size

背景色をフォームと同じ色にしているところ,コントロールの大きさを自動で
調節しているところがポイントです。
みなさんどうもありがとうございます。
自分の場合、アニメーションすると同時に透過表示や拡大縮小などもしたいと思っています。ですので、できればImageクラスのオブジェクトとして取得したいところです。

適当に間隔の短いタイマーを作ってそこから this.Invalidate() を呼んだところ、完璧ではないですが多少滑らかになったので、とりあえずこの方法で行きたいと思います。
GIFアニメをちゃんと扱うには外部ライブラリの使用等も考えないとだめかも知れませんね。
というわけでどうもありがとうございました。
> 自分の場合、アニメーションすると同時に透過表示や拡大縮小などもしたいと

しつこいようで申し訳ありません。押しつける意図はなく,単にできたので紹介したいと思い投稿しました。
透過表示,拡大縮小に対応したWebBrowserによるアニメーションGIF表示クラスのサンプル

特徴 非常に滑らかなアニメーション表示ができる
   リソースを消費する

書式 New AnimeGIF(親コントロール,ファイル名,サイズ)
   サイズを省略した場合には実際のイメージのサイズになる

Public Class Form1

    Dim Image As AnimeGIF

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Image = New AnimeGIF(Me, My.Computer.FileSystem.SpecialDirectories.Desktop & "\rob6.gif", New Size(50, 50))
        Me.Controls.Add(Image)
    End Sub

End Class

Public Class AnimeGIF
    Inherits WebBrowser

    Sub New(ByVal Parent As Control, ByVal FileName As String, ByVal Size As Size)
        If Size = Nothing Then
            Using Img As Image = Image.FromFile(FileName)
                Size = Img.Size
            End Using
        End If
        Me.Size = Size
        Me.ScrollBarsEnabled = False
        Me.DocumentText = "<body topmargin=""0"" leftmargin=""0"" bgcolor=""#" & Hex(Parent.BackColor.ToArgb).Substring(2, 6) & """>" & _
                          "<img src=""" & FileName & """ width=""" & Size.Width.ToString & """ height=""" & Size.Height.ToString & """>" & _
                          "</body>"
    End Sub

    Sub New(ByVal Parent As Control, ByVal FileName As String)
        Me.New(Parent, FileName, Nothing)
    End Sub

End Class
重ねてすみません。C#でしたね。
もしよろしければ,脳内変換してください。

DOBON.NET | プログラミング道 | プログラミング掲示板