• 1
Martifan

Gif File

Вопросы

доброго времени сутки 
подскажите пожалуйста как запустить GIF файл? чтобы анимацию показывала

заранее спасибо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 ответов на этот вопрос

  • 0

А исправленный вариант под Windows корректно ли отображает вашу проблемную гифку???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Roma77751 сказал:

ПРОБЛЕМА РЕШЕНА! Всем спасибо, отдельное спасибо dnekrasov и IVGSoft, натолкнули на верную мысль. Только менять переменные надо было тут 

 Begin
      Stream.Read(RGBEntry, SizeOf(RGBEntry));
      With APalette do
      begin
        B := RGBEntry.R or (RGBEntry.R shl 8);
        G := RGBEntry.G or (RGBEntry.G shl 8);
        R := RGBEntry.B or (RGBEntry.B shl 8);
        A := $FF;
      end;

 видимо китайцы что то напутали...😄 Прикрепляю исправленный исходник.

FMX.GifUtils.rar

Screenshot_2018-11-27-18-51-20.png

Screenshot_2018-11-27-18-52-18.png

ай да картинка - аж пива захотелось) )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Roma77751 сказал:

ПРОБЛЕМА РЕШЕНА! Всем спасибо, отдельное спасибо dnekrasov и IVGSoft, натолкнули на верную мысль. Только менять переменные надо было тут 

 Begin
      Stream.Read(RGBEntry, SizeOf(RGBEntry));
      With APalette do
      begin
        B := RGBEntry.R or (RGBEntry.R shl 8);
        G := RGBEntry.G or (RGBEntry.G shl 8);
        R := RGBEntry.B or (RGBEntry.B shl 8);
        A := $FF;
      end;

А Вы под Windows проверили? Теперь у меня (с Вашим исходником) цвета R и B поменялись. Да и вообще, что-то мне совсем непонятна такая запись

 B := RGBEntry.R or (RGBEntry.R shl 8);

т.е. тут байту присваивается двухбайтное значение.

Да и проблема, как мне кажется, здесь в том, что при объявлении TInternalColor учитывается порядок байт (Big-Endian или нет), а вот в объявлении TGifRGB - нет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 23.08.2016 в 04:55, Martifan сказал:

доброго времени сутки 
подскажите пожалуйста как запустить GIF файл? чтобы анимацию показывала

заранее спасибо

 

подключаешь исправленный модуль

Gif: tgifplayer; // объявляешь переменную


procedure TForm1.FormCreate(Sender: TObject);
begin
 Gif:= TGifPlayer.Create(Self);//создаешь

 Gif.Image := Image1;//указываешь где будет отображаться gif-ка


  Gif.LoadFromFile(Tpath.Combine(TPath.GetDocumentsPath, 'filename'));// указываешь путь к файлу в данном случае на андроид папка assets\internal...если файл во внешнем доступе(просто \assets)пишешь путь Gif.LoadFromFile(Tpath.Combine(TPath.GetSharedDocumentsPath, 'filename')); 

   gif.Play;//воспроизводишь


end;

  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
34 минуты назад, Tumaso сказал:

А исправленный вариант под Windows корректно ли отображает вашу проблемную гифку???

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 минут назад, FREEFAR сказал:

ай да картинка - аж пива захотелось) )

А я взял сегодня пивка☺️

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 минут назад, dnekrasov сказал:

А Вы под Windows проверили? Теперь у меня (с Вашим исходником) цвета R и B поменялись. Да и вообще, что-то мне совсем непонятна такая запись


 B := RGBEntry.R or (RGBEntry.R shl 8);

т.е. тут байту присваивается двухбайтное значение.

Да и проблема, как мне кажется, здесь в том, что при объявлении TInternalColor учитывается порядок байт (Big-Endian или нет), а вот в объявлении TGifRGB - нет. 

под виндой не проверял. Но так и думал что цвета поменяются, этот код(неисправленный) под виндой норм все отображал, а под андроидом криво....с одним и тем же кодом...получается если мы тупо в коде поменяли цвета, то сейчас наверное под виндой все синее...😀 у меня конкретно была проблема с андроидом, это решение видимо не самое оптимальное, но меня устраивает....если есть желание давайте попробуем разобраться с этим...я за!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
43 минуты назад, Roma77751 сказал:

если есть желание давайте попробуем разобраться с этим...я за!)

Давайте

  TInternalColor = packed record
    case Integer of
      0:
{$IFDEF BIGENDIAN}
        (A, R, G, B: System.Byte);
{$ELSE}
        (B, G, R, A: System.Byte);
{$ENDIF}
      1:
        (Color: TAlphaColor);
  end;

...

  TGifRGB = packed record
{$IFDEF BIGENDIAN}
          B, G, R: Byte;
{$ELSE}
          R, G, B: Byte;
{$ENDIF}
  end;

...

  procedure ReadPalette(Stream: TStream; Size: Integer; var APalette: TPalette);
  var
    RGBEntry: TGifRGB;
    I: Integer;
    c: TInternalColor;
  begin
    SetLength(APalette, Size);
    for I := 0 To Size - 1 Do
    begin
      Stream.Read(RGBEntry, SizeOf(RGBEntry));
      with APalette[I] do
      begin
        R := RGBEntry.R;
        G := RGBEntry.G;
        B := RGBEntry.B;
        A := $FF;
      end;
    end;
  end;

Попробуйте заменить объявления типов и чтение палитры (то, что Вы меняли). На винде в таком виде работает правильно. Если на Android тоже будет всё ок, то можно считать, что теперь всё в порядке.

Изменено пользователем dnekrasov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
52 минуты назад, Roma77751 сказал:

под виндой не проверял. Но так и думал что цвета поменяются, этот код(неисправленный) под виндой норм все отображал, а под андроидом криво....с одним и тем же кодом...получается если мы тупо в коде поменяли цвета, то сейчас наверное под виндой все синее...😀 у меня конкретно была проблема с андроидом, это решение видимо не самое оптимальное, но меня устраивает....если есть желание давайте попробуем разобраться с этим...я за!) 

на иОС тоже порядок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
18 минут назад, FREEFAR сказал:

на иОС тоже порядок

это не может не радовать) на иос мне надо тоже чтобы гифки отображались корректно☺️

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
59 минут назад, dnekrasov сказал:

Давайте


  TInternalColor = packed record
    case Integer of
      0:
{$IFDEF BIGENDIAN}
        (A, R, G, B: System.Byte);
{$ELSE}
        (B, G, R, A: System.Byte);
{$ENDIF}
      1:
        (Color: TAlphaColor);
  end;

...

  TGifRGB = packed record
{$IFDEF BIGENDIAN}
          B, G, R: Byte;
{$ELSE}
          R, G, B: Byte;
{$ENDIF}
  end;

...

  procedure ReadPalette(Stream: TStream; Size: Integer; var APalette: TPalette);
  var
    RGBEntry: TGifRGB;
    I: Integer;
    c: TInternalColor;
  begin
    SetLength(APalette, Size);
    for I := 0 To Size - 1 Do
    begin
      Stream.Read(RGBEntry, SizeOf(RGBEntry));
      with APalette[I] do
      begin
        R := RGBEntry.R;
        G := RGBEntry.G;
        B := RGBEntry.B;
        A := $FF;
      end;
    end;
  end;

Попробуйте заменить объявления типов и чтение палитры (то, что Вы меняли). На винде в таком виде работает правильно. Если на Android тоже будет всё ок, то можно считать, что теперь всё в порядке.

попробовал. результат отрицательный. Опять все синее... на андроид

Изменено пользователем Roma77751

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

привет, подскажите, как загрузить и воспроизвесть GIF, "вшитый" в APK файле, чтоб не открывать из директории, .. вот это не действует:

procedure TForm4.FormCreate(Sender: TObject);
begin
  FGifPlayer := TGifPlayer.Create(Self);
  FGifPlayer.Image := Image1;
end;[/CODE]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.01.2019 в 09:08, beegl сказал:

привет, подскажите, как загрузить и воспроизвесть GIF, "вшитый" в APK файле, чтоб не открывать из директории, .. вот это не действует:

 


procedure TForm4.FormCreate(Sender: TObject);

	begin

	  FGifPlayer := TGifPlayer.Create(Self);

	  FGifPlayer.Image := Image1;

	end;[/CODE]

а если положить в ресурсы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 19.01.2019 в 13:17, FREEFAR сказал:

а если положить в ресурсы?

Подскажите, включение-своих-файлов - Remote Patch - assets\internal указать или что лучше, чтоб подхватить FGifPlayer.Image := Image1; ?

  FGifPlayer.LoadFromFile(System.IOUtils.TPath.Combine
    (System.IOUtils.TPath.GetDocumentsPath, 'GIF_Res.gif'));

Изменено пользователем beegl

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Вадим Смоленский
      Год назад в одной из веток проскочила ссылка на китайский сайт (http://www.raysoftware.cn/?p=559), где предлагалось готовое решение для показа анимированных гифок средствами FireMonkey на любых платформах. Сейчас эта ссылка, как и весь сайт raysoftware.cn, упорно не открывается; по счастью, контент сохранился в гугловском кэше. Я скопировал оттуда код юнита и перевел гуглом все китайские комментарии на английский, добавив их в скобках. Там был еще сопроводительный текст, в котором автор излагал мотивы, побудившие его взяться за эту проблему; каких-то важных технических деталей я в этом тексте не увидел.
      Привожу весь юнит ниже и очень надеюсь, что кто-нибудь из продвинутых коллег объяснит мне, как именно этим кодом можно воспользоваться, чтобы показать пользователю анимированный файл в формате GIF. Моей программерской квалификации, к сожалению, не хватает.
       
    • От FREEFAR
      Всем привет.
      Есть такое событие TakePhotoFromLibraryAction. Но вызов его дает возможность загрузить только фото.
      А как же получить доступ к файлу типа GIF ну или к видео?
      Неужели свои писать контейнер читая расшаренную папку с фото?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу