GIF 动画 TImage/Timage32

GIF animation TImage/Timage32

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

TImage 示例

这是调整后的 TImage,图像质量很差,但动画完美:

// GIF = TGIFImage
// TImage = TImage
GIF.Animate := True;
TImage.Stretch := True;
TImage.Proportional := True;
TImage.Picture.Assign(GIF);

TImage32 示例

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

// GIF = TGIFImage
// TImage32 = TImage32
GIF.Animate := True;
TImage32.ScaleMode := smResize;
TImage32.BitmapAlign := baCenter;
TImage32.Bitmap.Assign(GIF);

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

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

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

例如,如果您的显示器使用 60fps 而您的 gif 包含每秒 30 帧,那么您需要将每个帧显示两个刷新周期。不过,这将是一个简单的情况。

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

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