MIFF 格式
MIFF 头部 • MIFF 二进制数据
Magick Image File Format(MIFF)是 ImageMagick 自有的、与平台无关的位图图像存储格式。相较于其他图像格式,它的优势在于能够存储 ImageMagick 已知的所有元数据(例如图像色彩配置文件、注释、作者、版权等),而其他格式可能只支持其中很小一部分元数据,甚至完全不支持。MIFF 图像文件由两个部分组成。第一部分是头部,由以文本形式描述图像的键组成。下一部分是二进制图像数据。我们将在下面详细讨论这两个部分。
MIFF 头部
MIFF 头部完全由 ISO-8859-1 字符组成。头部中的字段是 key = value 格式的键和值的组合,每个键和值用等号(=)分隔。每个 key = value 组合至少用一个控制字符或空白字符分隔。注释可以出现在头部部分,并且始终用花括号分隔。MIFF 头部总是以冒号(:)字符结尾,后面跟一个 ctrl-Z 字符。在冒号前面加上换页符(formfeed)和换行符也很常见。换页符可防止在使用 Linux 的 more 程序时列出二进制数据,而 ctrl-Z 在 Windows 命令行的 type 命令中具有相同的效果。
下面是 MIFF 文件中通常会出现的 key = value 组合的部分列表:
| 键 | 说明 |
|---|---|
| background-color = color | |
| border-color = color | |
| matte-color = color | 这些可选的键分别反映图像的背景色、边框色和遮罩色。颜色可以是名称(例如 white)或十六进制值(例如 #ccc)。 |
| class = | 存储在 MIFF 文件中的二进制像素数据的类型。如果不存在此键,则假定为 DirectClass 像素数据。 |
| colors = value | DirectClass 图像中的颜色数。对于 PseudoClass 图像,此键指定色彩映射表中的条目数。如果头部中没有此键且图像为 PseudoClass,则假定为线性 256 色灰度色彩映射表。色彩映射表条目的最大数量为 65536。 |
| colorspace = | 像素数据的色彩空间。默认值为 RGB。 |
| columns = value | 图像的宽度(以像素为单位)。这是一个必需键,没有默认值。 |
| compression = | 用于压缩图像数据的算法类型。如果不存在此键,则假定像素数据未压缩。 |
| delay = microseconds | 图像序列中帧间的延迟(以微秒为单位)。 |
| depth = | 单个颜色值的深度,表示从 0 到 255(深度 8)、0 到 65535(深度 16)或 0 到 4294967295(深度 32)的值。如果缺少此键,则假定深度为 8。 |
| dispose = value | 图层处置方法。有效值如下:0 = 未指定处置。1 = 帧之间不处置。2 = 用头部中的背景色覆盖帧。3 = 用前一帧覆盖。 |
| gamma = value | 图像的伽马值。如果未指定,则假定伽马为 1.0(线性亮度响应)。 |
| id=ImageMagick | 将文件标识为 MIFF 格式的图像文件。此键是必需的,必须是第一个键值对,只能出现一次,且没有默认值。尽管此键可以出现在头部的任何位置,但它应作为头部的第一个键从第 1 列开始。这将使诸如 file(1) 之类的程序能够轻松地将文件识别为 MIFF。 |
| iterations = value | 图像序列在停止前循环的次数。 |
| label = { string ] | 为图像定义简短的标题或说明。如果标签中出现任何空白,则必须将其括在花括号内。 |
| matte = | 指定图像是否具有遮罩数据。遮罩数据通常对图像合成有用。 |
| montage = |
合成图像中各个图块(tile)的大小和位置。当图像是由若干不同图块合成时使用此键。一个图块由一个图像组成,并可选地包含边框和标签。width 是每个图块在水平方向上的像素大小,height 是垂直方向上的大小。每个图块的宽度像素数必须相等,高度像素数也必须相等。但宽度可以与高度不同。x offset 是从合成图像的垂直边缘到一行中第一个图块开始处的像素偏移量,y offset 是从水平边缘到一列中第一个图块开始处的偏移量。如果指定了此键,则图块名称的目录必须紧跟在图像头部之后。该目录的格式将在下面说明。 |
| page = value | 图像画布的首选大小和位置。 |
| profile-icc = value | International Color Consortium 色彩配置文件的字节数。该配置文件由位于 http://www.color.org/icc_specs2.html 的 ICC 配置文件规范定义。 |
| red-primary = x,y | |
| green-primary = x,y | |
| blue-primary = x,y | |
| white-point = x,y | 此可选键反映色度原色和白点。 |
| rendering-intent = | 渲染意图是由 International Color Consortium(http://www.color.org)定义的 CSS-1 属性。 |
| resolution = |
图像的垂直和水平分辨率。具体的分辨率单位(例如每英寸像素数)请参见 units。 |
| rows = value | 图像的高度(以像素为单位)。这是一个必需键,没有默认值。 |
| scene = value | 此 MIFF 图像文件的序列号。当 MIFF 图像文件是用于动画的文件序列中的一个时,此可选键很有用。 |
| signature = value | 此可选键包含一个唯一标识图像像素内容的字符串。推荐使用 NIST 的 SHA-256 消息摘要算法。 |
| units = | 图像分辨率单位。 |
也允许使用其他 key value 对。如果值包含空白,则必须用花括号括起来,如下所示:
id=ImageMagick
class=PseudoClass colors=256 matte=False
columns=1280 rows=1024 depth=8
compression=RLE
colorspace=RGB
copyright={© 1999-2017 ImageMagick Studio LLC}
⋮
请注意,key = value 组合可以用换行符或空格分隔,并且可以在头部内以任意顺序出现。注释(位于花括号内)可以出现在冒号之前的任何位置。
如果在头部中指定了 montage 键,则在头部之后跟一个图像图块的目录。该目录由合成图像中各个图块的名称组成,名称之间用换行符分隔。该列表以 NULL 字符终止。
如果在头部中指定了 color-profile 键,则在头部(如果头部中有 montage 键,则为蒙太奇目录)之后跟二进制色彩配置文件。
头部与图像数据之间用紧跟换行符的 : 字符分隔。
MIFF 二进制数据
接下来是二进制图像数据本身。图像数据的格式取决于头部中 class 键的值所指定(或未指定)的图像类别。
DirectClass 图像是连续色调图像,按照 colorspace 键的定义,存储为 RGB(红、绿、蓝)、RGBA(红、绿、蓝、alpha)、CMYK(青、黄、品红、黑)或 CMYKA(青、黄、品红、黑、alpha)强度值。对于深度为 8 的图像(0..255),每个强度值长度为一个字节;深度为 16(0..65535)时为两个字节;深度为 32(0..4294967295)的图像则需要四个字节,按最高有效字节优先的顺序排列。
PseudoClass 图像是带色彩映射表的 RGB 图像。色彩映射表存储为一系列红、绿、蓝像素值,每个值大小为一个字节。如果图像深度为 16,则每个色彩映射表条目占用两个字节,最高有效字节在前。色彩映射表条目的数量由 colors 键定义。色彩映射表数据紧跟在头部(如果头部中有 montage 键,则为图像目录)之后。PseudoClass 图像数据是指向色彩映射表的索引值数组。如果图像中有 256 种或更少的颜色,则图像数据的每个字节包含一个索引值。如果图像包含超过 256 种颜色或图像深度为 16,则索引值存储为两个连续字节,最高有效字节在前。如果 matte 为 true,则每个色彩映射表索引后面跟一个 1 或 2 字节的 alpha 值。
MIFF 文件中的图像像素数据可以是未压缩的、行程长度编码的、Zip 压缩的或 BZip 压缩的。头部中的 compression 键定义图像数据的压缩方式。未压缩的像素按行顺序、每次一条扫描线地存储。行程长度编码压缩对相同的相邻像素的连续段进行计数,并在像素之后存储一个长度字节(相同像素数减 1)。Zip 和 BZip 压缩对图像的每一行进行压缩,并在压缩行之前以最高有效字节优先的字(word)形式给出压缩像素的字节数。
MIFF 文件可以包含多个图像。只需将每个单独的图像(由头部和图像数据组成)连接到一个文件中即可。