Firemonkey 中的 GIF 动画
Posted
技术标签:
【中文标题】Firemonkey 中的 GIF 动画【英文标题】:Animated GIF in Firemonkey 【发布时间】:2012-08-05 22:37:02 【问题描述】:我正在尝试使用 TImage 以 Firemonkey HD 形式显示动画 GIF,但我没有看到任何动画方法。
使用 Vcl.Imaging.gifImg 不是一种选择,因为类型不同。
有人可以提出解决此问题的方法或可能的组件在 Firemonkey 下为 GIF 图像设置动画吗?
我现在找到的唯一方法是:
创建 TGIFImage 实例并加载 GIF 图片
遍历 gif.images:
一个。将当前图像保存到流中
b. Image1.bitmap.loadFromStream [Image1 is FMX:TImage]
有没有更智能的解决方案?
【问题讨论】:
如果您要在后台线程中进行成像,那么解决方案可能不像您想象的那么愚蠢。即使 FMX 本身就拥有它 - 它仍然并且完全按照这种方式完成 - 通过后台线程的帧切换。 otl.17slon.com 可能会使线程更容易一些 你还可以查看 Vampyre Imaging 库,它声称 Mercurial 支持 FMX(但显然不支持 2009 年发布的版本)。但是,您可能仍会实现帧切换工作线程。但我不知道。 Arioch 'The:TTimer 不是比使用线程更好更容易的选择吗?它们都最终出现在应用程序的消息队列中。每个 GIF 一个线程也会消耗资源...... 我不知道计时器是否会制作流畅的动画,但你肯定可以尝试一下。而且我不会使用中间流,而只是使用预先解包的位图数组 @Arioch,主要问题是位图。 iPath 在 FMX 环境中使用 VCL 类,TBitmap
或 TCanvas
等类不兼容。这就是使用流的原因;否则你可以直接使用TGIFImage
或TGIFRenderer
之类的类。 TTimer
对于动画来说已经足够了。如果您使用工作线程,那么您必须将 UI 与每个帧渲染同步,并且正如 iPath 正确所说的那样,将消息排入 UI 主线程的消息队列。甚至TGIFRenderer
本身也使用计时器,而不是用于渲染循环的线程;-)
【参考方案1】:
您可以将 TBitmapListAnimation 与单个图像一起使用,该图像将动画的每一帧都放在一个长条内。例如,如果您的动画有 4 帧并且是 32 像素 x 32 像素,那么您需要创建一个 128 像素宽 x 32 像素高的图像并并排添加每一帧...
然后在表单中添加一个TImage(您不必在其中加载位图)
添加一个 TBitmapListAnimation 以 TImage 作为其父级
双击AnimationBitmap并加载您的动画图像条
下拉PropertyName并选择位图
在本例中将 AnimationCount 设置为 4,AnimationRowCount 设置为 1
设置启用为真
TBitmapListAnimation 对动画帧速率、反转、循环和插值有很好的控制。我找不到在 FireMonkey2 中获取 .gif 动画的方法,但如果您有办法将动画 .gif 转换为“卡通片”,那么这是制作动画的好方法。
PS这是Delphi XE3...所以不能说这些组件在以前的版本中是否存在。
【讨论】:
我相信这就是 XE3 中的TAniIndicator
的工作原理。 “卡通片”的正确术语是精灵或精灵列表。 :)以上是关于Firemonkey 中的 GIF 动画的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 中的 iOS 11 动画 gif 显示