GIF应用程序开发–挑战与技巧

发布于:2021-02-02 11:00:20

0

116

0

Android 博客 开发 GIF

在本文中,我们将讨论在Android平台上创建动画gif。如果您想开发像Giphy-Cam或GIF-Maker&GIF-Editor&Video-Maker这样的应用程序,有必要了解在GIF-Maker应用程序开发过程中您会遇到哪些挑战,以及如何面对这些挑战。

为什么安卓会这么做本机不支持(动画)GIF?

GIFs在Android上的支持从一开始就不是完美的。长话短说:在android8(Oreo)之前,系统本身(因此不考虑任何第三方库)只支持非动画gif显示(对于动画gif,只有第一帧显示为静态图像)。根本不支持编码。

从android9(Pie)开始,可以使用图像解码器。它可以产生动画图像绘制。不幸的是,这些类只是平台的一部分,并没有被后传到androidxjetpack,所以现在(2020年6月),只有大约40%的用户可以从中受益。

为什么GIF支持这么复杂?

好吧,但是为什么Android对GIF的支持这么差呢?嗯,只有谷歌能说出真相。然而,我们可以推断出一些原因

首先,实现显示动画图像比静态图像要困难得多。其次,编码(创建新文件)比解码(读取和显示)更困难。所以我们有一个困难组合!

静态图像与动画

让我们先来看看静态图像(如PNG或JPG)和动画(如GIF,但GIF也可以不是动画)之间的区别。

静态图像解码通常归结为获取输入(如本地文件或图像URL)和产生输出(位图–一个二维像素数组)。在这个操作之后,一切都取决于UI层,解码器不需要关心这个问题。请注意,我们现在考虑的是一个简单的情况—按原样显示图像。像Glide或Coil这样成熟的图像解码库具有缓存、转换等附加功能

动画可以描述为一系列静态图像(帧)。因此解码过程包括上述多个步骤。然而,还有更多的因素需要考虑。首先,我们需要一种计时器(时钟),它负责推进时间(切换到后续帧)。

这样的时钟需要知道UI生命周期。尤其是当用户界面不再活跃时(例如用户按下后退按钮或简单地切换到另一个应用程序),它需要被处理掉。

现在,我们说到点子上了。正确处理Android UI生命周期对实现它的开发人员来说是一个重大挑战。Android应用程序中的许多错误和崩溃都是由于不正确的生命周期处理导致的泄漏造成的。就连谷歌最近也不赞成AsyncTask——一个他们自己发明并推广多年的类。电影类,经常用于GIF解码,也曾经有一个漏洞。两个月后又发现了一个。

编码与解码

现在,让我们深入研究GIF编码,看看为什么这个过程比解码复杂得多。主要有两个原因。

GIF文件中的图像数据分为几帧。但是,它们并不总是与物理胶卷相同。让我们看一下以下动画:

编码的最有效方法是仅存储后续帧的差异:

当然,没有什么可以像这样保存完整尺寸的第二帧:

但是,这样做会导致GIF文件的整体大小变得更大(而且,如您在下一段中将看到的那样,颜色的数量可能会受到限制)。

请注意,现实生活中使用的GIF文件通常包含几十或几百帧,通常比这个简单示例中的帧大。通常,制作GIF的电影源输出全尺寸的帧。提取后续帧之间的差异不是一个简单的问题。

绝大多数当前使用的计算机和移动显示器(可能包括您正在阅读本文的显示器)以及图像格式(GIF、JPG、PNG等)都使用24位颜色深度。这意味着大约1600万种颜色(平均人眼可以分辨1000万种)。

但是,单个GIF帧最多只能包含256种不同的颜色。从前面的段落可以看出,GIF动画的当前可见状态可能包含许多帧,因此整个GIF中的颜色数与单个帧中的颜色数不同。

那么,如何将1600万种可能性整合到256个地方呢?好吧,很难有效地做到这一点,但是已经开发了许多技术,它们统称为抖动。尽管GIF格式已经有30多年的历史了(因此有人可能认为我们应该对它的一切都了如指掌),但新的编码技术(如礼品网)仍在不断发展。

GIF编码是一个复杂的操作,它需要在Android设备上以合理的性能工作。在应用程序中创建GIF编码需要熟练的开发人员,他们知道如何使用本机开发工具包(NDK)。

如何应对GIF应用开发中的障碍?

正如你所见,GIF-maker应用程序在Android上的开发带来了很多问题。有没有办法解决这些问题?好吧,没有银弹。然而,我们可以找到一些可以进一步组合的部分解。

现在,许多著名的第三方库(如Glide、Coil)都在处理GIF动画显示,但毕加索却没有。对于更复杂的操作,例如渲染到OpenGL纹理或更改帧速率,可以使用android gif drawable。

然而,Android上的GIF编码通常需要一些额外的开发和对NDK的熟悉。

现成的库确实存在,但可能不是功能齐全(比如gifencoder不支持透明性),或者不再维护(比如gifencoder)。许多著名的开源低级图形库(如gifsicle或FFmpeg)都可以为Android编译。甚至还有像mobileffmepeg这样的包装器,可以简化对Android的适应。

GIF应用程序开发-总结

如您所见,很难显示,甚至更难创建动画gif。即使是谷歌的开发者也有麻烦。请记住:

  • 为Android开发GIF应用程序需要额外的时间进行研究和测试。

  • 在选择开发团队为Android构建GIF maker应用程序时,请确保他们熟悉Android NDK。

  • 由于这些类型的项目不是小菜一碟,因此值得与已经有经验的团队合作在创建类似的应用程序时。

  • 今天推荐的解决方案明天可能会过时和弃用,因此该应用程序可能需要定期维护。