【问题标题】:GIF animation TImage/Timage32GIF动画TImage/Timage32
【发布时间】:2018-08-30 18:53:44
【问题描述】:

我们的目标是让动画 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 组件进行更好的重采样。

【问题讨论】:

  • 在播放动画时重新采样每一帧并不是一个好主意。尝试在这里考虑不同的策略,我不知道,创建例如带有重新采样帧的内存 GIF。
  • 或者使用不同大小的不同GIF
  • @RemyLebeau:这样的 GIF 是用户提供的,这就是为什么我不能有不同的 GIF,我只有一个,并且必须在运行时调整大小
  • @Victoria:这正是我目前的解决方法,我在读取文件流后创建了一个调整大小的 TImage32 的堆叠数组,并通过使用 TTask 更改各个帧的可见性来为它们设置动画。但是制作正确的动画很棘手,我想避免那种特殊的蠕虫

标签: delphi animation gif graphics32


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 太糟糕了,Graphics32 中没有 GIF 解码器,Delphi Tpicture 解码器在渲染动画方面做得很好,但在图像重采样方面做得很糟糕。我在将两全其美与自定义 Graphics32 GIF 动画渲染器相结合方面取得了一定的成功,但我遇到了您描述的时间问题。动画太快或太慢,无法完全正确,性能也是一个问题。
  • 如上所述,这并不是很复杂,但是要按原样编写所有代码很耗时(即没有时间问题)。由于 GR32 是一个开源库,因此需要一些贡献。
  • 我忘了提到可能使用 vampyre 成像库(参见 imaginglib.sourceforge.net)来完成这项任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2014-10-22
相关资源
最近更新 更多