 |
|
Как определить конец проигрывания gif
Здравствуйте, есть форма, на которой обьект - PictureBox. И вот такой незамысловатый код. Вопрос в том - как определить конец проигрывания gif анимации, ну или заставить ее проигрывать покадрово командой, а не как по дефилту - автоматом по-кругу. Просто время засечь не катит ибо на разных машинах оно разное (вопрос производительности в конкретный момент)
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public int local_time;
Random rand;
int last;
public Form1()
{
InitializeComponent();
local_time = 0;
rand = new Random();
choise.Start();
this.SetDesktopLocation(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Right - 109, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Bottom - 121);
}
private void choise_Tick(object sender, EventArgs e)
{
int choises;
do
{
choises = rand.Next(4, 11);
}
while (choises == last);
if (choises == 10)
{
pictureBox1.Image = WindowsFormsApplication3.Properties.Resources._1_4_5sec;
pos1.Start();
}
else
if (choises == 9)
{
pictureBox1.Image = WindowsFormsApplication3.Properties.Resources._2_3sec;
pos2.Start();
}
else
{
pictureBox1.Image = WindowsFormsApplication3.Properties.Resources.stay_0_4sec;
pos3.Start();
}
last = choises;
choise.Stop();
}
private void pos1_Tick(object sender, EventArgs e)
{
pos1.Stop();
choise.Start();
}
private void pos2_Tick(object sender, EventArgs e)
{
pos2.Stop();
choise.Start();
}
private void pos3_Tick(object sender, EventArgs e)
{
pos3.Stop();
choise.Start();
}
private void picture_refresher_Tick(object sender, EventArgs e)
{
pictureBox1.Refresh();
}
}
}
в ресурсах - 3-и gif анимашки разной длительности.
|
Beyound, конкретно код не дам, но очевидно, по счётчику фреймов в GIF файле.
|
в том то и вопрос - как его извлечь и picturebox или из picturebox.image или еще как???
|
PictureBox скрывает всю рутинную работу по организации проигрывания анимации Gif файла. Вручную, для иллюстрации самого процесса, достаточно воспользоваться классом Image и таймером.
Пример на VB.NET
Код:
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Drawing.Imaging
Class GifPlayer
Inherits Form
Dim imFile As Image
Dim iFrame As Single = 0
Dim frameCount As Single
Dim Dimension As FrameDimension
Dim tmr As New Timer()
Shared Sub Main()
Application.Run(New GifPlayer())
End Sub
Sub New()
imFile = Image.FromFile("My.gif")
Dimension = New FrameDimension(imFile.FrameDimensionsList(0))
frameCount = imFile.GetFrameCount(Dimension)
AddHandler tmr.Tick, AddressOf TimerOnTick
tmr.Interval = 100
tmr.Enabled = True
End Sub
Private Sub TimerOnTick(ByVal obj As Object, ByVal ea As EventArgs)
imFile.SelectActiveFrame(Dimension, iFrame)
iFrame += 1
Dim grfx As Graphics = CreateGraphics()
grfx.DrawImage(imFile, Point.Empty)
grfx.Dispose()
If iFrame >= frameCount Then tmr.Enabled = False
End Sub
End Class
Единственное, время анимации берётся не из Gif файла, а задаётся явно (100мс на каждый кадр в примере выше).
Собственно If iFrame >= frameCount и будет условием окончания проигрывания анимации.
|
спасиб большое.. попробую... с темой про разбиение на фреймы и выбор активфрейма я уже догадался.. а вот с тем как побороть стандартную прорисовку, которая начинает крутить фреймы по кругу заново чето недогадался попробовать класс graphics. как попробую отпишусь
|
Время: 03:11.
© OSzone.net 2001-