从开发者的角度讲,一张图片有两种形态,一种是加载进内存时用于转换、显示的位图,一种则是用于传送、保存的压缩文件。位图形式的图片变化不多,不外乎是一个像素用几个字节保存、保存在哪块内存的变化。但是压缩文件形式的图片间的差异就非常大,比如我们经常用到的PNG、JPEG、GIF、WebP的图片格式,每一个都有一套自己的实现规范。而且图片格式的进步没有停止,新的格式在过去几年涌现,比如苹果最先支持的HEIC、最近Android开始支持的AVIF。
什么是HEIF、HEIC、AVIF?
在进一步介绍Android显示HEIC、AVIF图片前,先来捋清楚这三者之间的关系
HEIF
High Efficiency Image File Format(HEIF)由 Moving Picture Experts Group ( MPEG,即动态图像专家组) 于2013年开发,基于ISOBMFF标准。HEIF是图片格式的容器,不特指某种图片格式,和传统的图片格式有区别,比如JPEG,它表面上只是描述如何将一个图片转换为字节的数据流(如DCT变换、量化、哈夫曼树等),但是它也间接约束了保存形式,比如JPEG/JFIF 和 JPEG/Exif 的差别只是某个段的差异,图像数据都依靠JPEG的解码器才能解码。而HEIF只是规定了保存图片格式时各种数据(格式、元数据、压缩数据)怎么存放,至于存放的数据用什么处理它不关心,下面是诺基亚给出的HEIF的文件主要结构:
数据只存在叫Box的数据结构中,Box可以嵌套其他Box。静态图片文件存在ftyp、meta、mdat这三个主要的Box,moov Box是用来记录图片序列之间的差异,单张图片没有这个Box。
HEIC
HEIC是HEIF的一个变种,它表示这个文件使用HEVC编解码器,最先在苹果的设备上普及,以一张iPhone拍摄的HEIC照片为例介绍它的文件格式。
最简单的是ftyp Box,它描述了这张图片的图片格式,以及它可以兼容的图片格式,:
1 | heic文件前0x28(十进制40)个字节: |