Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Извлечение индексов кадров и определение состояния анимации в TGIFImage

Delphi , Мультимедиа , Микрофон

TGIFImage с анимацией GIF - события не работают - как обнаружить прогресс анимации?

При использовании Delphi's TGIFImage для отображения анимированных GIF изображений, вы можете столкнуться с проблемой, когда события, такие как OnPaint, OnAfterPaint, OnLoop и OnEndPaint, не вызываются во время воспроизведения анимации. В этом руководстве мы рассмотрим, как извлечь текущий индекс видимого кадра, определить, когда анимация завершена, и обнаружить, когда следующий кадр будет отображаться, используя альтернативный подход с TGIFRenderer.

Проблема: Delphi's TGIFImage имеет события OnPaint, OnAfterPaint, OnLoop и OnEndPaint, но они не вызываются при воспроизведении анимированного GIF. При использовании следующего кода для отображения анимированного GIF:

FGif := (Image1.Picture.Graphic as TGIFImage);
FGif.OnProgress := GifProgress;
FGif.OnLoop := GifLoop;
FGif.OnPaint := GifPaint;
FGif.OnEndPaint := GifEndPaint;
FGif.OnAfterPaint := GifAfterPaint;
FGif.Animate := True;

Невозможно извлечь текущий индекс видимого кадра, определить, когда анимация завершена, или обнаружить, когда следующий кадр будет отображаться. Событие OnProgress вызывается только во время первого цикла анимации, и после последнего кадра анимации TGIFImage продолжит анимацию с первого кадра, но это событие перестает работать.

Решение: Большинство событий, которые вы упомянули, не реализованы, хотя и есть места для них. Кажется, они отсутствуют уже около десяти лет, когда был произведен значительный ремонт в модуле GifImg. Однако с помощью другого подхода вы можете решить эти проблемы, объявив отдельно TGIFRenderer, что дает вам доступ к необходимой информации.

Пример приложения:

type
  TForm22 = class(TForm)
    Button1: TButton;
    OpenDlg: TOpenDialog;
    SaveDlg: TSaveDialog;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    r: TRect;
    gif: TGifImage;
    rend: TGIFRenderer;
    procedure GifChange(Sender: TObject);
  public
  end;

implementation

procedure TForm22.Button1Click(Sender: TObject);
begin
  if not OpenDlg.Execute() then Exit;

  // Установите задержку анимации на 10 для правильного времени
  GIFDelayExp := 10;

  gif:= TGIFImage.Create;
  gif.LoadFromFile(OpenDlg.FileName);
  gif.OnChange := GifChange;

  r := Rect(0, 0, Gif.Width, Gif.Height);
  r.offset((Image1.Width-Gif.Width) div 2, (Image1.Height-Gif.Height) div 2);

  rend := TGIFRenderer.Create(Gif);
  rend.Animate := True;
  rend.StartAnimation;
  rend.Draw(Image1.Canvas, r);

  // Установите animate на true в конце, иначе будет вызвано исключение по адресу.
  gif.Animate := True;
end;

procedure TForm22.GifChange(Sender: TObject);
begin
  rend.Draw(Image1.Canvas, r);

  Label1.Caption := Format('Frame nr %d / %d',[rend.FrameIndex, gif.Images.Count]);
  Label2.Caption := Format('Per frame: %d ms',[rend.FrameDelay]);
  Label3.Caption := Format('Full cycle: %d s',[rend.FrameDelay * gif.Images.Count]);
end;

Используя TGifRenderer.FrameIndex, TGifImage.Images.Count и TGifRenderer.FrameDelay, вы можете рассчитать ответы на ваши вопросы.

В заключение, хотя события в TGIFImage не работают при воспроизведении анимации, вы можете использовать альтернативный подход с TGIFRenderer для извлечения индексов кадров и определения состояния анимации.

Создано по материалам из источника по ссылке.

При использовании Delphi's TGIFImage для отображения анимированных GIF изображений, события, такие как OnPaint, OnAfterPaint, OnLoop и OnEndPaint, не вызываются во время воспроизведения анимации.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Микрофон ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:10:27/0.0031359195709229/0