Перейти к содержанию
Fire Monkey от А до Я
  • 1

Gif File


Martifan

Вопрос

Рекомендуемые сообщения

  • 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;

 видимо китайцы что то напутали...<em><span class=?"> Прикрепляю исправленный исходник.

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 минут назад, 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
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
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...