Linux 图形格式
如果说计算机世界有一个统一的特征,那就是不一致性。在计算机图形领域,这一点体现得尤为明显。实际上存在几十种不同的格式来做同一件事:存储图形图像。专有格式、独立的自由标准和国际标准都在争夺关注。幸运的是,计算机社区已经确定了少数几种格式。有些格式,如 TIFF,是万事通,用途广泛。另一些格式,如 GIF,则占据了特定的领域。但无论在何种情况下,总有不止一种存储图像的方式。
本文首先简要介绍 Linux 上的图形,包括格式和类型、压缩、文件结构以及各种特性。然后继续描述 Linux 世界中常见的图形格式以及用于操作它们的程序。
图形格式主要有两种类型:光栅 和 矢量。光栅格式逐像素地存储整个图像,是最常用的格式。矢量格式,也称为描述性格式,不包含像素图像数据;相反,它们包含一系列命令,告诉显示程序如何绘制图像。
矢量格式最常见的用途是在计算机辅助设计 (CAD) 中。例如,将一条线描述为一个起点、一个终点和一种颜色,而不是一个点域中的许多彩色点,这允许程序将该线作为一个对象来操作,从而可以轻松地更改颜色、长度和位置。另一个常见的用途是在光线追踪程序中。这些程序获取几何对象并追踪光线的路径以找到阴影和高光。由于渲染的对象是几何形状,因此将图像存储为“位于 (3,4,3) 的十二面体,大小为 2,颜色为 27”比存储为像素值数组要容易得多,尤其是在要渲染的场景是三维的情况下。当然,一旦场景经过光线追踪,生成的图像就会以光栅格式存储。
图像主要有四种基本类型:单色(黑白)、灰度、调色板和真彩色。
灰度和调色板图像通常每个像素有 2、4 或 8 位。它们使用必须包含在图像文件中的查找表;颜色查找表中的每个条目都给出了颜色的红色、绿色和蓝色值。灰度图像具有类似的灰度值查找表。每个颜色或灰度值都在 2 位图像的 0-3 范围、4 位图像的 0-15 范围和 8 位图像的 0-255 范围内。实际的图像像素数据是一系列对应于表条目的颜色或灰度值,这些条目给出了每个像素的实际颜色。
真彩色图像是 24 位图像,通常存储为每个像素 8 位红色、8 位绿色和 8 位蓝色。某些格式可能使用与 RGB 不同的颜色模型。例如,JPEG 格式使用基于亮度和两个色度值 (YCbCr) 的颜色空间。真彩色图像不需要颜色查找表或调色板。
压缩是大多数图形格式不可或缺的一部分。未压缩的 640x400x256 色图像需要略多于 256,000 字节,而相同大小的真彩色图像则需要四分之三兆字节。虽然存在许多压缩方案,但只有少数几种在图形应用程序中很常见。LZW、LZ77、Huffman 和行程长度编码是无损的,这意味着图像在解压缩时会完全重现。余弦变换是“有损” JPEG 格式的基础。我们在这里不关注压缩方案的细节。
JPEG 提供了迄今为止最好的压缩,但以牺牲精确的图像再现和速度为代价。压缩比为 25:1 时通常可以获得可接受的结果,也就是说,压缩后的文件比原始文件小 25 倍。如果图像质量不是首要考虑因素,则可以实现 100:1 的压缩比。
[脚注:然而,确实存在更好的算法:分形图像压缩。这种方法在 100:1 的压缩比下也能提供良好的结果,并且正在找到许多应用,尽管它尚未作为通用图形格式得到广泛实施。]
LZW 和 LZ77 是最好的无损方案,并且产生类似的结果:通常约为 2:1 的压缩比。PNG 图形格式中使用的改进型 LZ77 在压缩图像时比 LZW 稍慢,但它创建的文件更小,并且解压缩速度更快。LZ77 也被通用压缩程序 ZIP、GZIP 和 PKZIP 使用。直到最近,LZW 的使用比 LZ77 更为普遍。然而,它的使用正在减少,因为它是一种专利算法,并且 UNISYS 要求对其使用支付版税。尽管如此,最常见的三种格式中的两种,GIF 和 TIFF,都使用了它。
行程长度编码 (RLE) 是最常见的方案,也是效果最差的方案。然而,与其他压缩算法相比,它非常快。它的基本机制非常简单:当遇到具有相同值的像素字符串时,RLE 输出像素值以及具有该值的连续像素的数量。复杂图像使用此方案压缩效果不佳,但单色图像通常压缩效果非常好。
简单格式仅包含图像数据和一个简短的标头,标头提供显示图像所需的最小信息量:大小和颜色数量。更强大的格式通常采用标签或块结构。在初始标头之后,图像存储在一系列块中,每个块都以一个代码为前缀,告诉解码软件该块包含的内容。最大的块是实际的图像数据。其他块可能包括注释块、调色板信息或其他特殊图像信息。软件可能仅支持给定格式的某些块:如果遇到未知块,则只需跳过它。
最后,有三个特殊功能值得仔细研究:用于格式识别的魔数、伽玛校正和 Alpha 透明度蒙版。在某些情况下,可以通过查看文件本身来识别文件的格式。许多格式使用魔数——特殊的(希望是唯一的!)代码——来识别格式。例如,GIF 文件在文件开头有“GIF87a”或“GIF89a”。由于这些魔数是 ASCII 编码的,因此使用 less、strings 甚至 cat(尽管这可能会意外更改您的字符集)在屏幕上显示它们就足以识别它们。例如,要查找 GIF 文件,您可以使用 strings filename | grep GIF。
伽玛校正是正确显示图像的重要组成部分。每当图像显示在显示器上时,显示器的特性都会影响图像。显示器如何处理不同程度的亮度尤其重要。一般来说,屏幕上的亮度与原始图像的亮度级别通过一个简单的公式相关:屏幕亮度等于图像亮度提升到伽玛次方。大多数显示器的伽玛值约为 2.5。为了补偿这一点,图像捕获硬件和软件可能会对图像进行“相反”的操作。结果是伽玛值为 0.45 的图像。当显示此图像时,0.45 和 2.5 的伽玛值相互抵消,产生大约 1 的表观伽玛值(称为线性亮度比例)。
但伽玛值在视觉上意味着什么呢?伽玛值小于 1 的图像在其较暗区域中使用更多的像素代码,也就是说,较暗区域具有更好的颜色分辨率。伽玛值大于 1 的图像在其较亮区域中使用更多的像素代码。模糊的图像或对比度过高的图像可能需要进行伽玛校正。校正图像的伽玛值本质上是有损的,因为在取幂期间存在舍入误差;因此,伽玛校正应在显示图像时执行,保持原始图像文件完好无损。
Alpha 透明度蒙版是一种隐藏或遮罩图像部分区域的方法。除了图像数据之外,图像文件中还为每个像素包含一个值。值为 2bitdepth-1 是不透明的,像素正常显示。值为 0 是透明的,允许屏幕的背景颜色透过来——图像完全不可见。最简单的应用是制作非矩形图像。定义一个与图像大小相同的数组,然后在两个对角之间绘制一条线。将线上方每个点的值设置为 1,将下方的值设置为 0。结果将是一个三角形图像。
BMP
BMP 是 Microsoft Windows 使用的本机位图格式。它是一种功能最少的格式,功能很少,并且使用简单的行程长度编码进行数据压缩。随着 Windows 的广泛使用,BMP 是最常见的格式。在许多方面,BMP 与 PCX 格式非常相似,并且已经承担了 PCX 曾经扮演的角色。
BMP 编码 1 位、2 位、4 位、8 位和 24 位图像。OS/2 使用类似的 BMP 格式,唯一的区别是标头稍简单。BMP 标头的前两个字符始终是“BM”。
WMF
Windows MetaFile (WMF) 是 Microsoft Windows 的另一种本机格式。WMF 使用 Windows 的图形设备接口 (GDI) 函数调用来存储应用程序中重复出现的图像。GDI 调用提供对设置屏幕、定义区域、颜色、文本、线条、多边形和位图的支持。WMF 支持未压缩的单色、调色板和真彩色图像。
GIF
图形交换格式(发音为“吉夫”)最初由 Compuserve 信息服务开发,作为早期 RLE 格式的彩色替代品。自 1987 年发布以来,GIF 已成为图形交换的标准,尤其是在网络上。1989 年的第二个版本为该格式添加了几个新功能。GIF 是一种基于 LZW 压缩方案的无损格式。它使用标签系统来识别文件中的扩展块,尽管只定义了少数几个标签。该格式最大的优点是其相对简单性、出色的压缩和广泛的可用性。
然而,该格式有两个主要缺点。首先,它基于受版权保护的压缩方案,使用它的商业软件必须向专利持有人 Unisys 支付版税。其次,GIF 只能用于颜色少于或等于 256 色的图像。(严格来说是这样。由于 GIF 支持局部颜色表,因此可以在图像中间更改调色板,从而允许超过 256 种颜色。不幸的是,许多可用的软件不支持或支持不佳此功能,并且充其量使用起来很笨拙。)GIF 文件可以通过文件开头的字符串 GIF87a 或 GIF89a 来识别。
JPEG/JFIF
JPEG(发音为“杰佩格”)是图像有损压缩的标准。JPEG 通过将图像分解为 8x8 像素的框,对每个框执行称为余弦变换的数学运算,并丢弃高频/小细节分量来实现压缩;丢弃的分量越多,压缩率越高,图像质量越差。然后,将剩余的频率分量进行行程长度编码,并使用 Huffman 算法进行压缩。要查看图像,必须解压缩 JPEG 文件、解码并执行逆余弦变换。这个三步过程使得显示 JPEG 非常慢。幸运的是,JPEG 产生了出色的压缩效果,几乎没有或没有可见的图像损失。
JPEG 本身实际上不是图像格式,而是一组用于压缩图像数据的标准。JFIF,即 JPEG 文件交换格式,是通常称为 JPEG 的格式。JFIF 不支持 JPEG 的所有功能,但旨在作为图像传输的最小实现。TIFF 格式的 6.0 版本中包含 JPEG 的全功能实现。设计人员希望 JPEG 的两种实现方式(一种最小实现和一种全功能实现)能够阻止软件供应商定义基于 JPEG 的专有格式(早期的 Macintosh 版本尤其以不兼容性而闻名)。
JPEG 最适合真实世界的图像;线条图和卡通的压缩效果不如扫描图像。与大多数其他格式不同,JPEG 不会将像素存储为红色、绿色和蓝色值。相反,它使用一种称为 YCbCr 的格式。由于大多数显示硬件使用 RGB 值,因此必须转换 YCbCr 值——这是又一个减慢解压缩速度的步骤。JFIF 标头包含 ASCII 字符“JFIF”以进行格式识别。
PBM/PGM/PPM
这三种格式是 PBMPLUS 实用程序使用的中间格式。这些首字母缩略词代表便携式位图/灰度图/像素图。PBM 用于单色图像,PGM 用于最多 256 种灰度阴影的灰度图像,PPM 用于使用最多 24 位真彩色的彩色图像。第四种“格式”是便携式任意图 PNM。PNM 实际上不是格式本身。使用 PNM 的程序可以读取和写入 PBM、PGM 和 PPM 文件。PNM 用于支持多种图像类型的实用程序。例如,由于可能不知道 TIFF 文件的图像类型,因此 PNM 读取 TIFF 文件并写入适当的文件类型。
这四种格式中的每一种都可以读取其他携带较少信息的格式。也就是说,PGM 实用程序读取 PGM 和 PBM,PPM 实用程序读取 PPM、PGM 和 PBM。PBM、PGM 和 PPM 实用程序始终以自己的格式写入,而 PNM 实用程序通常写入它们读取的任何格式。这些格式将数据存储为 ASCII 或二进制数据,并且是基本格式,由标头和图像数据组成。标头由用于识别格式的魔数、图像大小以及(PBM 除外)颜色/灰度阴影的数量组成。魔数字符串为 PBM P1(P4)、PGM P2(P5) 和 PPM P3(P6),其中第一个代码是 ASCII 数据的代码,括号中的代码是二进制数据的代码。真彩色图像将像素数据存储为 RGB 数据的数字三元组。有关 PBMPLUS 软件包的更多信息,请参见下面的软件部分。
PCX
PCX 格式是 Z-Soft 的 PC Paintbrush 程序的本机格式,并使用行程长度编码。作为最早的通用格式之一,它的使用非常广泛:很少有程序无法识别它。PCX 是一种基本格式,由 128 字节的标头和图像数据组成。支持单色以及 4 位、8 位和 24 位彩色图像。4 位图像的调色板包含在标头中,而 8 位调色板附加在图像数据之后。这种不均匀性是旧格式更新为较新硬件的结果。因此,PCX 的使用已逐渐减少,转而使用更连贯和统一的 BMP。
PNG
令人惊讶的是,在所有其他可用格式的情况下,仍然存在一个重要的未填补的空白:一种便携式、相对简单、免费的标准,用于无损交换真彩色图像——简而言之,是具有非专利压缩算法的 24 位 GIF 版本。存在可以使用的现有格式,但只有 TIFF 具有必要的功能,并且它存在过度完整性的问题:很少有实现利用整个 TIFF 规范。需要的是一种足够简单的格式,以便任何支持它的查看器都可以读取使用它保存的任何图像。
Compuserve 将其开发规范称为 GIF24,但是当一群互联网图形专家开发出 PNG(便携式网络图形,发音为“砰”)时,Compuserve 采用了它作为 GIF 的继任者。PNG 是 GIF 的自然扩展,尽管由于压缩方案的更改,它不向后兼容。除了原始的 GIF 功能外,PNG 还支持高达 48 位的真彩色图像和高达 16 位的灰度图像,以及完整的 Alpha 通道、伽玛校正和文件损坏检测。在 8 位及更大的数据上,PNG 可以在压缩之前对图像数据使用预处理器。在许多情况下,这种处理提高了压缩效率并导致更小的文件大小。预计很快就会在您附近的存档中看到 PNG 文件。
PS/EPS
PostScript (PS) 是 Adobe Systems 开发的一种页面描述语言,它既是一种描述性格式,也是一种光栅格式,并且已成为最常见的打印机语言之一。PostScript 文件由许多应用程序程序创建,作为与设备无关的输出格式。封装 PostScript (EPS) 是 postscript 的一个有限版本,用于单张图片,用于包含或“封装”在程序或 postscript 文件中的图像。postscript 文件的第一行是以下形式的行
%!PS-Adobe-3.0
其中数字指的是创建文件时使用的 PostScript 版本。EPS 文件在此行后附加 EPSF-3.0。PostScript 是一种庞大而通用的语言。Display PostScript 是 PostScript 的一种实现,用于控制视频硬件,并被 NeXT 计算机和软件使用。
TGA
Targa Truevision 图形格式是为在 Truevision 产品线中使用而开发的。TGA 使用行程长度编码来存储灰度、颜色表和真彩色图像,并且可以包括注释、伽玛、alpha、颜色校正和图像的“邮票”版本。TGA 是最早的真彩色格式之一,并且仍被某些应用程序使用,例如 Persistence of Vision Ray Tracer。TGA 文件可能在文件末尾包含一个块,其中包含文本 TRUEVISION-XFILE。
TIFF
标签图像文件格式是最强大的格式。顾名思义,TIFF 自由地使用了标签概念。通常使用随机访问来读取 TIFF 文件,因为标签字段可以按任何顺序排列;图像文件目录提供文件中数据位置的偏移量。(即使目录也可以位于文件中的任何位置!一个简短的标头给出了文件中的目录位置。)TIFF 格式定义了几类图像数据:双层(单色)、4 到 8 位灰度或调色板、24 位 RGB 和 24 位 YCbCr。它支持行程长度、Huffman、LZW 和 JPEG 压缩。大多数实现不支持所有 TIFF 功能,这使得 TIFF 成为一种可能令人恼火的格式。但是,TIFF 具有大量功能(在标签中实现),使其独一无二。TIFF 最初用于桌面出版,现已扩展到视频、传真和文档存储,以及医疗和科学成像。由于其复杂性,它通常不用于家庭应用。
XBM/XPM
X-Windows 定义了几种用于内部使用的格式。X 位图 (XBM) 是一种 ASCII 格式,用于在程序的 C 源代码中包含 1 位图像:XBM 图像是代码的组成部分,在编译时而不是运行时包含。XBM 数据通常包含在头文件中,并包括两个用于图像宽度和高度的 define 语句,后跟一个静态无符号字符数组。XBM 图像通常用于 X 中的图标和光标位图。X 像素图 (XPM) 是颜色调色板图像的等效格式。它的使用与 XBM 相同,只是添加了颜色表和三个额外的 define 语句,用于版本号、颜色表长度和每个像素的字节数。X 定义了一种通用的图像格式,即 X Window Dump (XWD 或 WD) 格式。XWD 支持所有类型的未压缩光栅数据。
在了解了一些常见的图形格式之后,我们最后快速了解一些可用于转换图像的可用程序和库。
xv 和 ImageMagick
这两个 X 程序用于显示、转换和操作图像。xv 可以读取和写入 JPEG、GIF、TIFF、PBM/PGM/PPM 和 X 格式,尽管它不能将 24 位图像显示为 24 位。除了格式转换外,xv 还可以执行简单的图像操作,例如,旋转、翻转、裁剪、放大和伽玛校正。ImageMagick 支持 xv 支持的格式,以及 TGA。它可以将输出直接发送到 postscript 打印机,并且比 xv 具有更多的图像操作功能:剪切、复制、粘贴、调整大小、翻转、浮动、旋转、反转、浮雕等等,可以对整个图像或部分图像进行操作。
ghostscript
查看 PostScript(包括 EPS)并从中转换的规范方法是 ghostscript。Ghostscript 既可以通过命令行选项操作,也可以交互式操作。输入始终是 PostScript 文件,输出可以是多种不同的文件格式、打印机语言或屏幕类型中的任何一种。默认情况下,ghostscript 将其输出发送到 X 终端,但它也可以将图像保存到文件。Ghostview 是 ghostscript 的一个流行的前端,它可以改善屏幕处理。
PBMPLUS
PBMPLUS 实用程序是一组 120 个用于图像转换和操作的程序。PBMPLUS 定义了三种中间格式:PBM、PGM 和 PPM(请参见上面的列表)。基本理念是,如果有 20 种格式,则需要 20 的平方,即 400 个程序/子例程来在它们之间进行转换。使用中间格式将该数字减少到 2 乘以 20,即 40 个。除了转换程序外,还有许多简单的图像处理程序:缩放、旋转、平滑、卷积、伽玛、裁剪等等。NETPLUS 是 PBMPLUS 的较新版本,但某些版本存在严重的错误。
C 库支持
对于使用图形的 C 程序员,存在大量的支持。现在可以使用用于 JPEG/JFIF、TIFF 和 PNG 的库。此外,许多其他格式的代码片段可以从 Internet 存档站点轻松获得。
IJG JPEG/JFIF 库
进行 JPEG 编程的最简单方法是使用独立 JPEG 组 (IJG) 的库。此库基于 JFIF 规范,并包括许多 Unix 系统上常见的两个程序,用于存储和检索 JFIF 图像:cjpeg 和 djpeg。该库以源代码和编译代码的形式提供。
SGI TIFF 库
与 JPEG 库一样,可以使用一整套例程来实现 TIFF。此库由 Sam Leffler 和 SGI 编写,也以源代码和编译代码的形式提供。该库包括用于转换、抖动、拆分和显示有关 TIFF 文件信息的程序。
PNG 工具箱
随着最近宣布支持 PNG 格式,Compuserve 还宣布了一个 PNG 工具箱。该工具箱使用 zlib 库进行 LZ77 代码,旨在加速新格式的接受。其使用将免版税。测试版可在 Compuserve 上获得。
Internet 上有几个存档站点,可以在其中找到程序和更多信息
匿名 ftp 站点:ftp://sgi.com/graphics/tiff TIFF 6.0 版规范和 SGI TIFF 库的源代码ftp://sunsite.unc.edu/pub/Linux/apps/graphics/convert PBMPLUSftp://sunsite.unc.edu/pub/Linux/X11/xapps/graphics ImageMagickftp://sunsite.unc.edu/pub/Linux/libs/graphics Linux 的 JPEG 和 TIFF 库的编译版本ftp://sunsite.unc.edu/pub/Linux/apps/graphics/viewers Linux 的 ghostscript 编译版本ftp://ftp.wuarchive.edu/ 大量图像格式的代码片段分散在这个大型存档中compuserve.com GRAPHSUPPORT 论坛,库 20,LP071.zip,PNG 工具箱的测试版www.uwm.edu/~ggraef。链接列表和其他格式信息的直接链接
Gerald Graef (ggraef@csd.uwm.edu) 是一位理论物理学博士候选人,居住在使用 Alpha、Sparc 和 Linux 计算机的环境中。他的主页位于:www.uwm.edu/~ggraef。