フォームのPictureBoxにアニメーションGIFがありますが、常にループしています。どうすれば1回だけ再生できるようになりますか?
別のプログラム(ブラウザなど)でgifを表示すると、必要に応じて1回だけ再生されます。ただし、私のフォームでは、アニメーションのループ間の非常に短いぎくしゃくした一時停止だけで、常にループします。
フォームのPictureBoxにアニメーションGIFがありますが、常にループしています。どうすれば1回だけ再生できるようになりますか?
別のプログラム(ブラウザなど)でgifを表示すると、必要に応じて1回だけ再生されます。ただし、私のフォームでは、アニメーションのループ間の非常に短いぎくしゃくした一時停止だけで、常にループします。
しばらく時間がかかりました...ここでは、フレームの数を取得し、フレームの終わりまでgifをアニメーション化します。
Public Class Form1
Dim animatedImage As New Bitmap("a.gif")
Dim currentlyAnimating As Boolean = False
Dim framecounter As Integer = 0
Dim framecount As Integer
Dim framdim As Imaging.FrameDimension
Private Sub OnFrameChanged(ByVal o As Object, ByVal e As EventArgs)
PictureBox1.Invalidate()
End Sub
Sub AnimateImage()
If Not currentlyAnimating Then
ImageAnimator.Animate(animatedImage, New EventHandler(AddressOf Me.OnFrameChanged))
currentlyAnimating = True
End If
End Sub
Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
If framecounter < framecount Then
AnimateImage()
ImageAnimator.UpdateFrames()
e.Graphics.DrawImage(Me.animatedImage, New Point(0, 0))
framecounter += 1
End If
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
framdim = New Imaging.FrameDimension(animatedImage.FrameDimensionsList(0))
framecount = animatedImage.GetFrameCount(framdim)
End Sub
End Class
サイクルの長さを判断できる場合は、適切な時間が経過したらピクチャーボックスを無効にすることでアニメーションを停止できます。
編集:PictureBoxのソースコードを確認したところ、PictureBox自体でこの動作を変更する方法はないようです。
ただし、実行可能な代替手段があるように見えます。ImageAnimatorクラスは、PictureBoxが内部で使用するものです。MSDNの記事には、一度アニメーション化する方法の良いサンプルがあります。
これはかなり簡単な解決策です。アニメーションGIFの1つのループの合計時間のタイマーを作成しました。タイマーが停止すると、画像ボックス内の静止画像に画像が変更されます。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
PictureBox1.Image = Image.FromFile("c:\GIF\AnimatedGif.gif")
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
PictureBox1.Image = Image.FromFile("c:\GIF\StillImage.gif")
Timer1.Enabled = False
End Sub