Delphi GIF动画TImage/Timage32

Delphi GIF动画TImage/Timage32,delphi,animation,gif,graphics32,Delphi,Animation,Gif,Graphics32,其目标是让动画GIF在图像组件内播放,即使在调整其中一个图像组件的大小后,也能获得良好的图像质量 TImage示例 这是调整大小的TImage,图像质量非常差,但动画完美无瑕: TImage32示例 这是graphics32库中调整大小的TImage32,图像质量非常好,但根本没有动画,只有第一帧可见: 我需要让TImage32组件播放动画,或者让TImage组件进行更好的重采样。图形32并不意味着开箱即用地显示动画(如GIF)。此外,它不包含本机GIF解码器。您显示的代码依赖于Delphi

其目标是让动画GIF在图像组件内播放,即使在调整其中一个图像组件的大小后,也能获得良好的图像质量

TImage示例 这是调整大小的
TImage
,图像质量非常差,但动画完美无瑕:

TImage32示例 这是graphics32库中调整大小的
TImage32
,图像质量非常好,但根本没有动画,只有第一帧可见:


我需要让
TImage32
组件播放动画,或者让
TImage
组件进行更好的重采样。

图形32并不意味着开箱即用地显示动画(如GIF)。此外,它不包含本机GIF解码器。您显示的代码依赖于Delphi的内部TPicture解码器。使用assign转换到TImage32时,只会复制第一帧,因此会产生静止图像

为了显示动画,您需要进一步的代码。如评论中所述,首先将GIF的每一帧复制到TBitmap32实例(TImage32的开销太大)是有意义的。然后执行动画。如果可能,这应与显示刷新率有关,或至少考虑自上次图形以来的时间间隔

例如,如果您的显示器使用60fps,并且gif每秒包含30帧,则您需要在两个刷新周期内显示每个帧。不过,这将是一个容易的情况

如果gif每秒包含29帧,事情会变得稍微复杂一些(例如)。您需要开发一种算法来为当前时间选择正确的帧


到目前为止,我还没有看到任何针对Graphics32的上述实现,但一旦您知道要做什么,就不会那么复杂。

在播放动画时对每一帧重新采样不是一个好主意。试着在这里考虑一个不同的策略,我不知道,例如创建一个带重采样帧的内存GIF,或者使用不同的GIF进行不同的操作。sizes@RemyLebeau:这样的GIF是由用户提供的,这就是为什么我不能有不同的GIF,我只有一个,并且必须在runtime@Victoria:这正是我目前的解决办法,在读取文件流之后,我创建了一个大小调整后的Timage32的堆叠数组,并通过使用TTask更改单个帧的可见性来设置动画。但是正确地制作动画是一件棘手的事情,我想避免这种特殊的虫子。太糟糕了,图形中没有GIF解码器32,Delphi Tpicture解码器在渲染动画方面做得很好,但在图像重采样方面做得很差。我成功地将这两个方面的优点与自定义Graphics32 GIF动画渲染器结合在一起,但我遇到了您描述的计时问题。动画速度太快或太慢,无法完全正确地完成,性能也是一个问题。如上所述,动画并不复杂,但要将所有代码按应有的方式编写(即没有时间问题),需要花费大量时间。由于GR32是一个开源库,它需要一些贡献。我忘了提到可能会使用vampyre imaging库(请参阅)来完成此任务。
// GIF = TGIFImage
// TImage = TImage
GIF.Animate := True;
TImage.Stretch := True;
TImage.Proportional := True;
TImage.Picture.Assign(GIF);
// GIF = TGIFImage
// TImage32 = TImage32
GIF.Animate := True;
TImage32.ScaleMode := smResize;
TImage32.BitmapAlign := baCenter;
TImage32.Bitmap.Assign(GIF);