Android Q的一项新功能是支持高效图像格式(HEIF)图像,但为什么这很重要?在这篇文章中,我们将看看HEIF实际上是什么,并了解它可能带来的好处。
HEIF由运动图像专家组(MPEG)开发,是一种压缩容器格式,声称比JPEG更有效,同时提供更好的图像质量。声称HEIF图像通常是JPEG等效图像的一半,同时具有高质量。
要在Android Q中实际使用HEIF图像不需要任何费力,因为您可以在绘图资源中包含与JPEG图像完全相同的HEIF图像。此外,BitmapFactory它将以与JPEG图像完全相同的方式对HEIF图像进行充气。但由于硬件和许可要求,目前没有向后兼容性。Pie中包含有限的支持ImageDecoder(有关如何使用的详细信息,请参阅此文章ImageDecoder),但这取决于设备,这有点暗示存在硬件要求。
虽然目前没有读取HEIF图像的向后兼容性,但是有一个用于编写它们的支持库。它可以写入Bitmap,Surface或YUV字节缓冲区。我们可以Bitmap从资产文件中读取a 并使用以下内容将其作为HEIF写入本地缓存目录HeifWriter:
suspend fun convertToHeif(assetName: String): Long {
return withContext(Dispatchers.IO) {
val bitmap = readBitmapAsset(assetName)
val file = File(context.cacheDir, "beach_huts.heif")
HeifWriter.Builder(
file.canonicalPath,
bitmap.width,
bitmap.height,
HeifWriter.INPUT_MODE_BITMAP
)
.setQuality(quality)
.build().apply {
start()
addBitmap(bitmap)
stop(0)
close()
}
file.length()
}
}
private fun readBitmapAsset(assetName: String): Bitmap {
return context.assets.open(assetName).use { inputStream ->
BitmapFactory.decodeStream(inputStream)
}
}
虽然在我们到达之前可能觉得我们不应该使用HEIF图像,但minSdkVersion = 29实际上我们可以在此之前获益。如果您正在使用Android应用程序包,并且正在使用Play商店中的动态传送,那么在您的res/drawables-*-v29文件夹中包含HEIF图像将允许动态传送以将APK中的HEIF图像捆绑到Q和更高版本的设备中,因此从开始将会带来实实在在的好处现在包括在内。随着具有HEIF功能的设备数量的增加,这些优势将随着时间的推移而增加。
为了了解HEIF如何与JPEG进行比较,此帖子的示例应用程序读取图像并将其保存为JPEG和HEIF图像,以确保我们进行比较,因为两个图像都是由Android框架图像生成的编解码器。JPEG和HEIF使用它们使用有损压缩算法quality值,以确定如何压缩实际上有损是。两者的质量都是100,实际上是无损压缩。
该应用程序具有SeekBar允许将不同的质量值应用于图像转换的应用程序。在无损压缩(质量= 100)时,HEIF图像(顶部一个)是3.72 MB,而JPEG一个(底部一个)是5.85 MB。这非常接近半尺寸声明,我看不出图像质量有任何差异 - 但是如果压缩真的是无损的话应该不会有:
事情可能会让人感到困惑的是中等质量的价值观。JPEG图像尺寸急剧下降,而HEIF尺寸则逐渐减小。请记住,这不是真正的相似比较,因为质量值对于不同的压缩算法意味着不同的东西。
在quality = 25
我可以清楚地看到JPEG图像中出现一些文物,而HEIF图像看起来仍然很好 - 如果不是比JPEG图像更好quality = 50
。
如果我们将quality = 25
上图中的JPEG 与下图中的HEIF 进行比较,则会更有趣quality = 15
。文件大小相当,JPEG quality = 25
为814 kB,HEIF quality = 15
为891 kB。
然而,HEIF的质量要好得多。虽然有些文物开始出现,但它们远不如JPEG图像那样明显quality = 25
。因此,HEIF的质量可以设置得比JPEG低得多,以在较小的图像尺寸下获得更好的质量。
只是把事情发挥到极致,就在质量标准的最底端,我们看到了一些真正的差异:
HEIF图像的大小是JPEG图像的三分之一,但质量要好得多。JPEG图像既是分色的又是块状的,而HEIF只是块状的。虽然两者都不是很好,我真的不想实际使用它们中的任何一个,但HEIF的质量明显优于JPEG,而其尺寸仅为其三分之一。
正如我之前提到的,我们无法直接比较质量值,而是应该查看任何给定质量值的图像质量。对于无损压缩,HEIF获胜,但我们可以使用低得多的质量值,HEIF仍可实现高水平压缩,同时仍保持良好的图像质量。
值得指出的是,不同的图像会有不同的压缩,所以我在这里所做的结果远非确凿的证据。也就是说,在这种情况下使用HEIF可以获得明显的尺寸/质量优势。而且我完全期望将趋势扩展到其他图像,到目前为止我对HEIF的体验倾向于支持这种观点。
ps: 最后还有个HEIF、AVIF、JPEG和WebP图像对比网站仅供参考
https://compare.rokka.io/_compare/