Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как определить конец проигрывания gif (http://forum.oszone.net/showthread.php?t=196564)

Beyound 13-01-2011 19:54 1587994

Как определить конец проигрывания 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 анимашки разной длительности.

yurfed 13-01-2011 20:37 1588021

Beyound, конкретно код не дам, но очевидно, по счётчику фреймов в GIF файле.

Beyound 13-01-2011 22:54 1588147

в том то и вопрос - как его извлечь и picturebox или из picturebox.image или еще как???

Admiral 16-01-2011 17:08 1589956

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 и будет условием окончания проигрывания анимации.

Beyound 16-01-2011 21:35 1590151

спасиб большое.. попробую... с темой про разбиение на фреймы и выбор активфрейма я уже догадался.. а вот с тем как побороть стандартную прорисовку, которая начинает крутить фреймы по кругу заново чето недогадался попробовать класс graphics. как попробую отпишусь


Время: 03:11.

Время: 03:11.
© OSzone.net 2001-