一些GIF查看器的Delphi TGIFImage动画问题

 问晓 发布于 2022-12-25 20:06

我发现使用Delphi 2009创建的动画GIF TGIFImage有时在某些 GIF查看器中无法正常播放.问题是动画过早地重新启动.

请考虑以下示例:

program GIFAnomaly;

{$APPTYPE CONSOLE}

uses
  Windows, Types, Classes, SysUtils, Graphics, GIFImg;

var
  g: TGIFImage;
  bm: TBitmap;

procedure MakeFrame(n: integer);
var
  x: Integer;
  y: Integer;
begin
  for x := 0 to 256 - 1 do
    for y := 0 to 256 - 1 do
      bm.Canvas.Pixels[x, y] := RGB((x + n) mod 255,
        (x + y - 2*n) mod 255, (x*y*n div 500) mod 255);
end;

var
  i: integer;

begin

  bm := TBitmap.Create;
  bm.SetSize(256, 256);

  g := TGIFImage.Create;
  g.Animate := true;
  for i := 0 to 499 do
  begin
    MakeFrame(i);
    TGIFGraphicControlExtension.Create(g.Add(bm)).Delay := 3;
    Writeln('Creating frame ', i+1, ' of 500.');
  end;
  TGIFAppExtNSLoop.Create(g.Images.Frames[0]).Loops := 0;

  g.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test.gif');


end.

(这是我能找到的解决问题的最简单的例子.)

输出是一个相当大的动画GIF.在Internet Explorer 11中,整个15秒的"电影"可以正常播放,但在谷歌浏览器中,"电影"仅在大约四秒后过早重启.

为什么是这样?

    输出GIF文件有问题吗?

    如果是这样,上面的代码是否有问题,或者是否有问题GIFImg

    如果不是,观众中问题的本质是什么?有多少可用的观众有这个问题?有没有办法在GIF创建过程中"避免"这个问题?

为了SO用户的利益,上面的代码是一个最小的工作示例.当然,当我发现这个问题时,我并没有创造出这些迷幻图案.相反,我正在研究一个Lorenz系统模拟器,并制作了这个GIF动画,它可以在IE中播放,但不能在Chrome中播放:

显示问题的样本GIF动画http://privat.rejbrand.se/lorenz50.gif

在Internet Explorer 11中,模型在重新启动动画之前旋转360度.在谷歌浏览器中,动画仅在大约20度后过早重启.

Lorenz映像适用于Internet Explorer 11.0.9600.17239,GIMP 2.8.0,Opera 12.16

洛伦茨图像不起作用在谷歌浏览36.0.1985.143男,火狐26.0,27.0.1,31.0.

如果我在GIMP中打开'有问题'的GIF并让GIMP(重新)将其保存为动画GIF,则结果可以在每个观看者中使用.以下是Lorenz动画的GIMPed版本:

已经GIMPed的示例GIF动画http://privat.rejbrand.se/lorenz50_GIMPed.gif

比较两个文件使用十六进制编辑器,并使用维基百科文章作为参考,例如,似乎'NETSCAPE'字符串在原始(unGIMPed)版本中的位置错误.这是有点怪,即使我设置widthheightGIF图像,在逻辑屏幕描述符对应的值是不存在的.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有