Firemonkey中的动态GIF

5
我正在尝试在Firemonkey HD表单中使用TImage显示动画GIF,但我没有看到任何用于动画的方法。由于类型不同,使用Vcl.Imaging.gifImg不是一个选项。有人能建议一种解决这个问题的方法或者组件来在Firemonkey下播放GIF图像吗?目前我找到的唯一方法是:
1.创建TGIFImage实例并加载GIF图像 2.循环遍历gif.images: a.将当前图像保存到流中 b. Image1.bitmap.loadFromStream [Image1是FMX:TImage]
是否有更智能的解决方案?

如果您在后台线程中进行图像处理,那么解决方案可能并不像您想象的那样愚蠢。即使FMX通过帧切换的方式已经具备本地化支持-这仍然是一种做法-通过后台线程完成。otl.17slon.com可以使线程更加容易。 - Arioch 'The
你也可以看看Vampyre Imaging库,它声称在Mercurial中支持FMX(但显然不在2009年发布的版本中)。然而,你可能仍需要实现帧切换工作线程。但我不确定。 - Arioch 'The
1
Arioch 'The: TTimer比使用线程更好、更容易吗?它们最终都会进入应用程序的消息队列。此外,每个GIF使用一个线程将消耗资源... - iPath ツ
我不确定定时器是否能够制作平滑的动画,但你可以尝试一下。我不会使用中间流,而是直接使用预先打包好的位图数组。 - Arioch 'The
1
@Arioch,主要问题在于位图。iPath在FMX环境中使用VCL类,例如TBitmapTCanvas等类不兼容。这就是使用流的原因;否则,您将能够直接使用TGIFImageTGIFRenderer等类。而且,TTimer对于动画来说已经足够了。如果您使用工作线程,则必须将UI与每个帧渲染同步,正如iPath所说,这会将消息排队到UI主线程的消息队列中。即使TGIFRenderer本身也使用计时器而不是线程进行渲染循环;-) - TLama
为什么在这个问题上投反对票? - iPath ツ
1个回答

5
您可以使用TBitmapListAnimation来处理单个图像,该图像包含动画中的每一帧。例如,如果您的动画有4帧,大小为32px x 32px,则需要创建一个宽度为128px、高度为32px的图像,并将每一帧并排添加到其中...
然后将TImage添加到窗体中(不必将位图加载到其中)。
使用TImage作为其父级添加TBitmapListAnimation
双击AnimationBitmap并加载您的动画图像条。
下拉PropertyName并选择Bitmap。
对于此示例,将AnimationCount设置为4,将AnimationRowCount设置为1。
将其启用。
TBitmapListAnimation可以很好地控制动画帧速率、反向、循环和插值。我无法找到在FireMonkey2中播放.gif文件的方法,但是如果您有将动画.gif转换为“卡通条”的方法,则可以使用此方法进行动画处理。
PS:这是Delphi XE3...因此无法确定这些组件是否存在于以前的版本中。

1
我相信这就是XE3中TAniIndicator的工作原理。"卡通条"的正确术语应该是精灵或精灵列表。 :) - Scott P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接