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

Почему функция по извлечению кадров из GIF не работает с одним конкретным файлом и как это исправить в Delphi

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

В статье будет рассмотрена проблема, с которой столкнулся разработчик, пытаясь извлечь кадры из GIF-файла с помощью функции на Delphi. Функция работает со всеми GIF-файлами, кроме одного, и вызывает ошибку доступа при попытке извлечь кадры из этого файла.

Причина проблемы заключается в том, что в GIF-файле есть свойство "DisposalMethod", которое определяет, как изображение в кадре должно быть удалено в подготовке к следующему кадру. В исходном файле это свойство установлено в значение "dmNoDisposal" для всех кадров, что работает без проблем в коде. В файле, вызывающем ошибку, оба кадра имеют значение "dmPrevious", что требует дополнительного внутреннего bitmap. Этот bitmap не выделяется, если "GIFRenderer" не инициализирован как анимированный.

Чтобы правильно инициализировать "GIFRenderer" для кадров с disposal методом "dmPrevious", нужно добавить одну строку кода:

GR.Animate := True;

после создания "GR".

Пример кода на Object Pascal (Delphi) для извлечения кадров из GIF-файла:

function GetGifFrames(GifFile: string): TObjectList;
var
  GIF: TGIFImage;
  TempFrame: TBitmap;
  Frame: TBitmap;
  Counter: Integer;
  GR: TGIFRenderer;
begin
  { Load GIF }
  GIF := TGIFImage.Create;
  try
    try
      GIF.Animate := FALSE;
      GIF.LoadFromFile(GifFile);
    except
      MesajError('Cannot load ' + GifFile);
      EXIT(NIL);
    end;

    if Gif.Images.Count = 1 then
    begin
      MsgError('This is not an animated GIF' + CRLF + GifFile);
      EXIT(NIL);
    end;

    Result := TObjectList.Create;
    Result.OwnsObjects := TRUE; { Array of images }

    { GIF render }
    TempFrame := TBitmap.Create;
    GR := TGIFRenderer.Create(GIF); { GIF render }
    GR.Animate := True; { Add this line }
    try
      TempFrame.SetSize(GIF.Width, GIF.Height);

      for Counter := 0 to GIF.Images.Count - 1 do
      begin
        { Skip bad frames }
        if GIF.Images[Counter].Empty
        then Continue;

        { Create new frame }
        Frame := TBitmap.Create;
        Frame.SetSize(GIF.Width, GIF.Height);
        GR.Draw(TempFrame.Canvas, TempFrame.Canvas.ClipRect); { Transfer image from GIF to BMP }
        Frame.Assign(TempFrame);
        Result.Add(Frame); { Add to list of bitmap frames }
        GR.NextFrame; { Advance }
      end;
    finally
      FreeAndNil(GR);
      FreeAndNil(TempFrame);
    end;
  finally
    FreeAndNil(GIF);
  end;
end;

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

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

В статье рассматривается проблема разработчика, столкнувшегося с ошибкой при попытке извлечь кадры из GIF-файла с помощью функции на Delphi, и предлагается решение путем добавления одной строки кода для правильной инициализации 'GIFRenderer'.


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

Получайте свежие новости и обновления по 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 10:53:19/0.0059609413146973/0