GIF动画TImage / Timage32

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GIF动画TImage / Timage32相关的知识,希望对你有一定的参考价值。

目标是即使在调整其中一个图像组件之后,也可以在图像组件内部播放具有良好图像质量的动画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组件更好地重新采样。

答案

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

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

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

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

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

以上是关于GIF动画TImage / Timage32的主要内容,如果未能解决你的问题,请参考以下文章

执行进程时 Gif 图像的动画不起作用

如何测试 TImage 是不是分配有图形?

为啥我尝试裁剪位图时出现空白 TImage?

如何从 TWebBrowser 获取图像到 TImage

Delphi 自定义 TImage 组件 - 组件中的 MouseEnter、MouseLeave

验证码生成器(在TImage.Canvas上写字,很好看)