图像文件格式
4.1 为什么有这么多的格式?
有几十种不同的图像格式是比较知名的,可能还有几百种不太知名的其他格式。为什么有这么多?
许多格式是在互联网普及之前,以及数码相机普及和价格低廉之前开发的。在那个时候,使用标准图像格式并不是一个优先事项,因为人们交换图像的情况相对较少。每个需要存储图像数据的操作系统供应商、行业机构或公司都可能发明他们自己的格式,而不是使用已经存在的格式。
许多这样的格式是多余的--至少在技术上可以用现有的格式来代替。不使用现有格式有一些很好的理由,例如,一些格式是专有的,甚至是秘密的,公司可能不想依赖属于竞争对手的标准。也有一些不好的原因,有时软件工程师只是喜欢发明他们自己的版本,以获得乐趣。
然而,不太可能有一种格式来统治它们。不同的应用有不同的要求,很难有一种单一的格式适用于所有情况。以下是需要不同格式的主要真正原因。
- logo和图表的高效无损压缩。例如,网络图像。PNG通常满足这一要求。
有效地压缩摄影图像,其中有损压缩是可以接受的。例如,存储照片或网络图像。JPEG通常满足这一要求。 - 一种单一的格式,可以存储许多不同类型的图像数据,具有不同的特性。例如,报纸/杂志印刷,图像可能来自不同的来源。在这种情况下经常使用TIFF。
- 一种真正简单的格式,用于存储小型图像,可以在低性能硬件(如嵌入式系统)上快速而容易地实现。Windows BMP格式就是一个例子。
- 也有各种具有独特特殊功能的格式。一个例子是GIF格式,它有能力在一个相对简单的文件格式中对动画进行编码。
4.2 图像数据和元数据
图像格式通常包含图像数据和图像元数据。
图像数据规定了图像中每个像素的颜色。元数据包含关于图像的信息。这通常以特定格式的方式存储。也有一些通用的元数据格式可供不同的图像类型使用,如EXIF。
以下是大多数图像格式提供的基本信息。
- 图像大小,以像素为单位。
- 图像分辨率,通常为每英寸像素或每厘米像素。这可以用来确定图像打印时的预期物理尺寸。例如,如果一幅图像的尺寸为1800×1200像素,分辨率为每英寸300像素,这意味着它打算以6×4英寸的尺寸打印(1800/300和1200/300)。当然,这并不妨碍它以不同的尺寸打印,它只是一个指标。
- 图像的模式,包括色彩空间(如RGB)、每个像素的比特数以及图像是否使用调色板。
- 数据的布局,例如,是以RGB值的序列存储,还是以R值、G值和B值的三个独立平面存储。
- 与使用的图像压缩类型有关的参数。
- 图像调色板,如果有的话。
- 特殊信息,如动画图像中的帧数。
并非每一种格式都包括所有这些信息,因为有时它是隐含的。这些信息通常存储在图像头中,这是一个在图像数据之前的数据块,但每种类型的图像的头的格式是不同的。
图像经常包含额外的元数据。
- 日期和时间信息。这是在创建图像时添加的。有些相机含有GPS硬件,可以自动添加照片的确切位置。
- 一个小的缩略图,可以显示而不需要读入整个图像。
- 相机设置。这里最有用的价值也许是相机的方向,因为这可以用来自动纠正在相机侧翻时拍摄的图像。但相机通常会返回每张图片的每项设置(光圈、快门速度等)的详细信息。
- 图像的描述。
- 图像的版权信息。
这些信息通常使用EXIF(可交换图像文件格式)进行编码。这可以附在JPEG和TIFF文件上。许多成像应用程序允许你读取、编辑或删除EXIF信息。
4.3 图像压缩
图像数据通常可以有几兆字节的大小,对于非常高分辨率的图像甚至更大。即使在现代的磁盘尺寸和网络速度下,压缩这些数据也有一定的好处。许多图像可以被压缩到原来大小的四分之一,而没有任何明显的质量损失,但如果可以接受适度的质量损失,将图像压缩到20倍或更大也是很常见的。这在很大程度上取决于图像本身,以及所使用的压缩类型。
图像压缩有两个主要类别,无损和有损。
无损压缩的目的是使图像数据变小,但不以任何方式改变图像。也就是说,如果你压缩一个图像,然后再解压缩,所得到的图像将与原始图像相同,每个像素都有完全相同的颜色。它的工作原理是找到图像中的任何自然冗余并对其进行更有效的编码。
有损压缩的工作方式不同。它将对图像数据进行修改,以使其更有效地被编码。这意味着,如果你压缩一个图像,然后解压缩,其结果将与原来不同。这并不像听起来那么糟糕,因为在大多数情况下,这些差异会非常轻微,你不会注意到。例如,如果你压缩了一张树的照片,一些树叶的细节可能会略有变化,但它们看起来仍然像树叶,所以图像不会有明显的缺陷。
我们不会详细讨论压缩算法,这是一个非常复杂的问题,现代图像格式如JPEG和PNG提供了非常有效的算法。了解压缩算法的特点是很有用的,但没有必要确切了解它们的工作原理。
4.3.1 无损压缩
无损压缩的目的是在不改变像素值本身的情况下,通过更有效的存储来减少数据的大小。我们将在这里看几个流行的方法--运行长度编码和Zip风格压缩。
下面是一个例子,每个方块代表一个像素。这张图片只有8个像素的正方形,使描述更容易一些。
我们可以简单地通过存储每个像素的颜色来存储这个图像。因此,图像的前两行将是。
白白白白白白白白白白白
白白白白白白绿绿绿白
以此类推。每种颜色将被存储为一个三字节的RGB值。这很好,但有点重复。
另外,我们可以将信息存储为一种颜色加上有多少个像素有这种颜色的计数。
白:8
白:5 绿:3 白:1
这告诉我们,第一行只有8个白色像素。第二行是5个白色像素,然后是3个绿色和1个白色。
这就是所谓的运行长度编码。我们需要想出一些格式来存储长度和颜色,但很明显,我们可以创建比原始数据小得多的格式,只要数据本身有大量相同颜色的长线。
这种压缩方法很简单,但对于像图或图表这样的图像来说非常有效。相当多的图像格式都使用它。
PNG格式使用一种稍微不同的方法,叫做DEFLATE(基于LZ77)。这与ZIP压缩的工作原理类似。它比运行长度编码取得了更好的效果,因为除了相同颜色的直线运行外,它还能利用其他重复的模式。
GIF格式也使用同一系列算法中的一个不同变体。
总的来说,这些方法对具有相同颜色块或其他可预测模式的图像效果很好。对于像素值不遵循规律的摄影图像,它们的效果较差。
4.3.2 有损压缩
有损压缩涉及丢弃信息以减少图像大小。有损压缩算法的主要例子是JPEG。
该算法很复杂,所以这里的描述被大大简化。从本质上讲,有三个阶段。
首先,图像被分成几个块,通常是8×8像素。每个块都被单独压缩。
接下来,该块被转换为二维频域。那是什么意思?你可能对你经常在高级音频系统或录音设备上看到的频率显示很熟悉。当音乐播放时,显示屏会向你显示信号中的低、中、高频率声音的数量。
图像块上的频率变换是一个类似的想法,但它的工作是空间频率而不是音频频率。而且它在两个维度上工作。变换后的块中仍然有8乘8的值,但每个值不是代表单个像素的颜色,而是代表特定空间频率下的变化量。
我们可以将一个图像块转化为频域,然后再将其转化为空间域,我们将得到相同的图像。但这本身并不能提供任何压缩。
第三步是对频域中的数值进行量化。我们的眼睛对高频变化不是很敏感,所以我们可以不太准确地进行编码。因此,对于较高的频率,我们不需要存储范围为0至255的值。例如,我们可以把它编码为一个0到3的值(表示0、85、190、255这4个值)。我们把实际值四舍五入到最接近的量化值,所以我们可以把它存储为2比特的量,而不是8比特的量。
在这种方案下,相当多的数值四舍五入为零是很常见的。一个零块可以被非常有效地编码,给出一个非常好的压缩率。
当我们解压这个数据时,单个像素值会有所不同,但该块的整体特征将是相似的。
也可以改变量化的数量。我们应用的量化越多,压缩效果就越好(但代价是精度降低)。
4.4 一些常见的文件格式
4.4.1 PNG格式
PNG(便携式网络图形Portable Network Graphics)于1996年推出,主要目的是为互联网提供一种合适的现代图像格式。
它支持以下颜色模式。
- RGB,每个像素使用24或48比特(即每个通道8或16比特)。
RGBA,每像素使用32或64比特(即每通道8或16比特)。 - 灰度,每像素使用1、2、4、8或16比特。
- 灰度和阿尔法,每个像素使用16或32比特(即每通道8或16比特)。
- 基于调色板的RGB。
- 基于调色板的 RGBA。
对于基于调色板的图像,调色板中的颜色总是以每通道8比特的方式存储。调色板最多可以包含256种颜色。
PNG使用Zip使用的压缩方案的一个变种,它为大多数图像提供合理的无损压缩。它特别适合于含有平面颜色区域的人工图像,如图表、图形、文本和类似物。它也可以压缩照片,但它的表现不如JPEG好。
PNG可以选择允许交错,使用Adam7算法,如位图数据一章中所述。
4.4.2 JPEG格式
JPEG(以创建它的小组命名,即联合摄影专家组 Joint Photographic Experts Group)于1992年推出。随着数码相机的引入,需要一种能够非常有效地压缩数码照片的格式。
它支持以下颜色模式。
- RGB每像素使用24比特(即每通道8比特)。
- 灰度和CMYK图像是可能的,但许多应用程序不支持这个。
- 每通道12比特是可能的,但许多应用程序不支持这个。
- 不支持透明度。
- 不支持每通道少于8比特。
JPEG使用有损压缩。你得到的图像与原始图像不完全相同,它有一些模糊和噪音,但如果是自然场景的照片,一般很难发现。它有质量设置,可以使压缩后的文件更小,但要牺牲图像质量。
JPEG对硬边缘的扭曲相当严重,所以它不适合用于图表或文本的图像。对于这些类型的图像,通常使用PNG更好。
4.4.3 GIF格式
GIF(图形交换格式 Graphics Interchange Format)是第一个被万维网广泛支持的图像格式。网络需要一种独立的、提供良好压缩的图像格式。GIF似乎是最好的解决方案,因此大多数浏览器都增加了对它的支持。GIF还允许透明和简单的动画。
它支持以下颜色模式。
- 基于调色板的RGB,允许图像中最多有256种独立的颜色。每个单独的颜色都是24位的RGB。
- 灰度,只使用调色板中的灰度值。
- 透明度,通过指定一个透明的调色板条目。
尽管GIF最初很受欢迎,但它只能显示256种不同的颜色,这意味着GIF图像的质量往往很低。此外,GIF像素可以是完全透明的或完全不透明的。这就不允许图形在边缘褪色,这又给了低质量的结果。PNG和JPEG通常是更好的选择。
GIF图像的一个独特特点是,它们可以存储多个图像,可以作为一个动画播放。这使得它们在创建动画标志甚至短视频剪辑时非常有用。
4.4.4 BMP格式
Windows BMP(位图Bitmap)格式是一种非常简单的格式,用于存储RGB或单色图像。
它支持以下颜色空间。
- RGB,每个像素使用24比特(即每个通道8比特)。
-RGBA,每个像素使用16或32比特(即每通道4或8比特)。
-基于调色板的RGB。
-灰度,只使用调色板中的灰色值。
图像可以是未压缩的,也可以使用一种运行长度压缩的形式进行压缩。
BMP是微软Windows图像的默认文件格式,但在许多情况下,现在使用PNG来代替。
4.5 动画
GIF提供简单的动画。GIF动画与任何其他图像的唯一区别是。
- GIF动画包含一连串的图像。
- 指定了显示图像之间的时间延迟。
当浏览器或图像查看器打开GIF时(假设查看器支持动画),它将一个接一个地显示图像。如果延迟的时间相当长(半秒或更多),图像将像幻灯片一样一个接一个地出现。如果图像之间的延迟很短(十分之一秒),它将看起来像一个略微生硬的视频。
GIF仍然是唯一被广泛支持的提供动画的图像格式。PNG格式的变种(称为MPNG和APNG)也做了类似的事情,但GIF动画已经存在了很长时间,每个浏览器和许多图像浏览器都支持它,所以它仍然是为网络创建简单动画的最流行方式。创建GIF动画的工具也比PNG动画多得多。
GIF动画的质量一般没有实际视频好。视频每秒钟至少需要24张质量好的图片。由于数据量巨大,它们需要使用远比图像格式更复杂的压缩。它们通常使用跨越多个帧的压缩方案,利用连续的帧通常非常相似的事实,以实现大得多的压缩率。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载