2

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

TImage 示例

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

图像示例

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

TImage32 示例

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

图形 32 示例

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

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

4

1 回答 1

0

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

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

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

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

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

于 2018-03-22T15:59:55.633 回答