GIF动画TImage / Timage32

时间:2018-03-21 15:10:08

标签: delphi animation gif graphics32

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

TImage示例

这是重新调整大小的TImage,图像质量非常糟糕,但动画完美无缺:

timage example

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

TImage32示例

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

graphics32 example

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

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

1 个答案:

答案 0 :(得分:0)

Graphics32并不是为了显示动画(如在GIF中)。此外,它不包含本机GIF解码器。您显示的代码依赖于Delphi的内部TPicture解码器。使用assign转换为TImage32只会复制第一帧,因此会产生静止图像。

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

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

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

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