图像除了实际的图像像素之外,还关联着大量的附加数据(元数据)。这些元数据可用于显示、各种计算,或用于修改后续图像处理操作的行为。你可以在许多选项中使用百分号转义,例如在 -format 或 montage 的 -label 中,以输出与图像关联的各种属性和其他设置。
| 配置文件数据(Profile Data) | 例如 EXIF: 数据,包含焦距、曝光、日期,某些情况下还包含 GPS 位置信息。 |
|---|---|
| 属性(Attributes) | 这些与图像数据直接相关,作为常规图像处理的一部分而更常被修改。包括宽度、高度、深度、图像类型(色彩空间)、定时延迟以及背景色。大多数专用的百分号转义都是为了访问这些信息。 |
| 属性值(Properties) | 这些以自由形式字符串表的形式存储,并(在可能的情况下)随图像一起保存(特别是 MIFF 和 PNG 图像文件格式)。包括:标签(Label)、说明(Caption)、注释(Comment)。 |
| 工件(Artifacts) | 这些是各种操作(高级)设置,供各种运算符使用,或供用户保存以备将来使用。它只是一个自由形式字符串表。写出图像时不会保存它们。详情参见下文「工件与选项」。 |
| 选项(Options) | 同样是供各种运算符使用的操作(高级)设置,但针对整个图像列表进行全局设置(同样不会保存)。参见下文「工件与选项」。 |
百分号转义处理
如果你请求一个像 %[key] 这样的百分号转义,将按以下顺序查找该设置,直到找到第一个匹配项……
- 处理诸如 'artifact:'、'option:'、'exif:' 或 'fx:' 等特殊前缀。这包括这些前缀的计算以及通配(glob),例如 'exif:' 或 'artifact:'(见下文)。
- 如果 key 包含通配模式(但没有已知前缀),则搜索自由形式属性值表。
- 如果 key 是特殊的图像「属性」名(见上面的列表),则返回关联的或计算出的图像属性。
- 将该设置作为自由形式「属性值(property)」搜索。
- 将该设置作为自由形式「工件(artifact)」搜索。
- 将该设置作为自由形式「选项(option)」搜索。
- 将转义替换为空字符串,并可能产生警告。
请注意,所有长名称形式的百分号转义都以不区分大小写的方式处理。
现在你可以直接访问工件和选项的自由形式字符串表,从而覆盖上述顺序,并避免访问同名的属性或属性值。
%[artifact:setting]
%[option:setting]
转义处理需要访问一个图像容器。如果没有可用的容器,将创建一个空白图像,以确保表达式能够被处理并返回一个值。例如 magick -print "%[fx:.8765/3.14]" null: null:。
单字母属性百分号转义
以下是常用的单字母转义(短格式),用于报告图像最常见的属性和属性值,例如:图像文件名、类型、宽度、高度。
| \ | 反斜杠,下一个字符为字面字符,不进行解释 |
|---|---|
| \n | 换行 |
| \r | 回车 |
| < | 小于号 |
| > | 大于号 |
| & | 与号(ampersand) |
| %% | 百分号 |
| %b | 读入图像的文件大小(使用 -precision 16 可强制以 B 为单位输出结果) |
| %c | comment 元数据属性值 |
| %d | 路径的目录部分 |
| %e | 文件名扩展名或后缀 |
| %f | 文件名(包含后缀) |
| %g | 图层画布页面几何(等价于 "%Wx%H%X%Y") |
| %h | 当前图像高度(像素) |
| %i | 图像文件名(注:对于 "info:" 会变为输出文件名) |
| %k | 计算值:唯一颜色的数量 |
| %l | label 元数据属性值 |
| %m | 图像文件格式(文件魔数) |
| %n | 当前图像序列中的图像数量,每帧报告一次 |
| %o | 输出文件名(用于委托程序 delegate) |
| %p | 图像在当前图像列表中的索引 |
| %q | 量子深度(编译时常量) |
| %r | 图像类别和色彩空间 |
| %s | 场景编号(除非重新分配,否则来自输入) |
| %t | 不含目录和扩展名(后缀)的文件名 |
| %u | 唯一的临时文件名(用于委托程序 delegate) |
| %w | 当前宽度(像素) |
| %x | x 分辨率(密度) |
| %y | y 分辨率(密度) |
| %z | 图像深度(除非修改,否则为读入时的深度,即图像保存深度) |
| %A | 图像透明通道。取值包括 Undefined(无透明通道)、Blend、Copy 或 Update。 |
| %B | 读入图像的文件大小(字节) |
| %C | 图像压缩类型 |
| %D | 图像 GIF 处置方法(dispose method) |
| %G | 原始图像尺寸(%wx%h;在任何调整尺寸之前) |
| %H | 页面(画布)高度 |
| %M | Magick 文件名(完全按给定的原始文件,包含读取修饰符) |
| %N | 当前图像序列中的图像数量,每个图像序列报告一次 |
| %O | 页面(画布)偏移( = %X%Y ) |
| %P | 页面(画布)尺寸( = %Wx%H ) |
| %Q | 图像压缩质量( 0 = 默认 ) |
| %S | ?? 场景 ?? |
| %T | 图像时间延迟(厘秒) |
| %U | 图像分辨率单位 |
| %W | 页面(画布)宽度 |
| %X | 页面(画布)x 偏移(含符号) |
| %Y | 页面(画布)y 偏移(含符号) |
| %Z | 唯一文件名(用于委托程序 delegate) |
| %@ | 计算值:修剪边界框(不实际进行修剪) |
| %# | 计算值:图像值的「签名」哈希 |
以下是针对文件名为 bird.miff、宽度 512、高度 480 的图像的示例命令及其输出。
-> identify -format "%m:%f %wx%h" bird.miff
MIFF:bird.miff 512x480
请注意,所有单字母百分号转义也都可以使用长格式(自 IM 版本 6.7.6-9 起,见下一节)。例如 %[f] 等价于短格式 %f。
警告:当百分号位于数字之后时,不会执行短格式百分号转义。例如 10%x10 不会将 %x 展开为百分号转义。如果你确实想展开 'x',请使用可覆盖此特殊情况的长格式。例如:10%[x]10。
另请注意,计算属性的生成可能需要一些时间,尤其是对于大图像。
长格式属性百分号转义
除了上述专用属性和计算属性外,用花括号括起来时(长格式)还可识别以下指定:
| %[basename] | 不含后缀的基本文件名(同 %t) |
|---|---|
| %[bit-depth] | 像素数据的实际位深度 |
| %[bounding-box] | 图像边界框的左上角和右下角 |
| %[caption] | caption 元数据属性值 |
| %[caption:lines] | 返回换行说明文字(caption)时生成的行数 |
| %[caption:pointsize] | 返回 caption: 处理过程中计算出的字号(pointsize) |
| %[channels] | 色彩空间助记符后接通道总数和元通道数,例如 cmyka 8.3 表示带 alpha 通道的 CMYK 图像,共 8 个通道和 3 个元通道。 |
| %[colors] | 图像中唯一颜色的数量(自 IM 7.0.3.8 起) |
| %[colorspace] | 图像数据的色彩空间(不含透明度) |
| %[compose] | |
| %[compression] | 图像压缩类型 |
| %[convex-hull] | 围绕前景对象形成凸包的点。使用 -define convex-hull:background-color=color 指定图像背景色。若背景色不均匀,使用 -fuzz。 |
| %[convex-hull:extreme-points] | 返回凸包的上、右、下、左极点。 |
| %[copyright] | ImageMagick 版权字符串 |
| %[depth] | 写出用的图像深度(除非更改,否则同输入) |
| %[deskew:angle] | 纠偏角度(旋转度数) |
| %[directory] | 文件名的目录部分(同 %d) |
| %[distortion] | 图像与参考图像的相似程度(-compare) |
| %[dominant-color] | 以十六进制返回图像的主色。使用前先执行 -kmeans。 |
| %[entropy] | 计算值:图像的熵 |
| %[extension] | 文件名的扩展名部分(同 %e) |
| %[gamma] | 图像伽马值 |
| %[group] | ??? 窗口组 ??? |
| %[height] | 图像的原始高度(读入时) |
| %[histogram:contrast-stretch] | 计算出的最小和最大对比度拉伸百分比 |
| %[histogram:linear-stretch] | 计算出的最小和最大线性拉伸百分比 |
| %[input] | 输入图像文件名。 |
| %[interlace] | 图像隔行扫描模式(自 IM 7.0.3.8 起) |
| %[kurtosis] | 计算值:图像的峰度统计量 |
| %[label] | label 元数据属性值 |
| %[label:pointsize] | 返回 label: 处理过程中计算出的字号(pointsize) |
| %[magick] | 用于读取图像的编码器(coder,而非文件后缀) |
| %[max] | 计算值:图像的最大值统计量 |
| %[mean] | 计算值:图像的平均值统计量 |
| %[median] | 计算值:图像的中值统计量 |
| %[min] | 计算值:图像的最小值统计量 |
| %[minimum-bounding-box] | 使用 -define convex-hull:background-color=color 指定图像背景色。若背景色不均匀,使用 -fuzz。除边界框点外,还会设置以下属性值:minimum-bounding-box:area、minimum-bounding-box:width、minimum-bounding-box:height、minimum-bounding-box:angle 和 minimum-bounding-box:unrotate。 |
| %[opaque] | 计算值:图像是否完全不透明? |
| %[orientation] | 图像方向 |
| %[page] | 虚拟画布(页面)几何 |
| %[papersize:name] | 72DPI 下 name 的纸张尺寸(像素)(例如 papersize:A4) |
| %[printsize.x] | X 打印尺寸 |
| %[printsize.y] | Y 打印尺寸 |
| %[profile:icc] | ICC 配置文件信息 |
| %[profile:icm] | ICM 配置文件信息 |
| %[profiles] | 任何嵌入配置文件的列表 |
| %[quality] | 图像质量值(自 IM 7.0.3.8 起) |
| %[rendering-intent] | 图像渲染意图(自 IM 7.0.3.8 起) |
| %[resolution.x] | X 密度(分辨率),不含单位 |
| %[resolution.y] | Y 密度(分辨率),不含单位 |
| %[scene] | 图像在输入文件中的原始场景编号 |
| %[size] | 图像的原始尺寸(读入时) |
| %[skewness] | 计算值:图像的偏度统计量 |
| %[standard-deviation] | 计算值:图像的标准差统计量 |
| %[type] | 计算值:图像类型 |
| %[unique] | 唯一的临时文件名 ??? |
| %[units] | 图像分辨率单位 |
| %[version] | 当前运行的此 ImageMagick 的版本信息 |
| %[width] | 图像的原始宽度(读入时) |
| %[zero] | 零(供委托程序 delegate 使用的唯一文件名) |
属性值(Properties)
所有其他长格式的百分号转义(非单字母长格式)都以不区分大小写的方式处理。这类转义将尝试以该名称查找特定数据源。
主要搜索空间(如果不是上面列出的特定属性)是自由形式属性值字符串。这类字符串与图像关联并随之保存,通常使用 -set CLI 选项(或 API 等价物)设置,或通过特殊的便捷选项(例如 -label、-comment、-caption)设置。
这些便捷选项被全局保存(作为「全局选项」,因此可在读取图像之前设置),随后仅在图像被读入时转移到各个图像的属性值。届时,其中存在的任何内部百分号转义都会被处理。
要更改已在内存中的图像的属性值,你需要使用 -set。
请注意,属性值与属性(以及配置文件)一样,在写出时,如果图像文件格式允许,会随图像一起保存。
工件与选项
之前的百分号转义与主要的属性(Attributes)和属性值(Properties)相关联。这是此类百分号转义的原始且主要的关注点。
然而,各种 ImageMagick 运算符使用的许多操作设置,能够设置并在之后访问会很有用。这些由按图像的工件(Artifacts)和全局选项(与图像列表关联,通常是当前图像列表)组成。
请注意,工件与属性值的主要区别在于:工件作为内部操作设置,不会随图像一起保存(即使可能保存)。
例如,当你使用 -define 'distort:viewport=100x100' 时,实际上生成了一个全局选项,-distort 运算符将用它来修改其行为(扭曲后输出图像的「视图」)。
选项本质上是作为图像列表(具体来说是图像的「Wand」)的一部分而全局存储的工件。因此,二者是相同的,即选项只是关联的所有图像的全局工件。
因此,你可以使用 -set 'option:distort:viewport' '100x100' 来达到与设置供 distort 操作使用的工件相同的结果。
全局选项的内部处理……
核心库('MagickCore')通常并不直接理解全局选项。承接前例,DistortImages() 函数仅查找工件以确定是否向它提供了 'viewport'。
当库函数请求工件时全局选项如何被使用,是 IMv6 和 IMv7 之间的关键区别之一。
它会设置一个回到全局选项数据的链接,因此如果未找到特定的按图像工件,便会直接查找该图像列表的等价全局选项。这样就无需将这些自由形式选项反复复制到工件中,并且意味着你现在可以分别为列表定义一个全局选项,以及为该列表中的特定图像定义一个用于覆盖的单独工件。
请注意,许多 API 并不使用 Wand(例如 PerlMagick 使用图像数组而非 Wand)。在这些 API 中,你将没有全局选项,只有按图像的工件。
总之,全局选项(如果可用)等价于按图像的工件。
属性值、工件和选项的通配模式列举
设置中可以包含通配模式。因此,你现在可以这样列举所有自由形式字符串的属性值、工件和选项(但不包括特定的图像属性)……
magick ... \
-print "__Properties__\n%[*]" \
-print "__Artifacts__\n%[artifact:*]" \
-print "__Options__\n%[option:*]" \
...
通配模式的格式非常特殊,因此通常仅用于列举特定设置(例如在调试时),而不用于图像处理用途。
计算系百分号转义前缀
有一些特殊前缀(位于第一个 ':' 之前),它们基于用户在该前缀之后提供的字符串执行计算。例如,你可以使用 %[fx:...] 进行数值计算,以求值给定的 FX 表达式:
%[fx:expression]
使用 pixel: 或 hex: 来求值由 FX 表达式定义的像素颜色:
%[pixel:expression]
使用 -define 指定颜色合规标准(例如 -define pixel:compliance=css)
.
特定配置文件的百分号转义前缀
你还可以使用以下特殊格式语法,输出读入图像中包含的 EXIF 图像元数据:
%[EXIF:tag]
从以下选择 tag:
* (print all EXIF tags, in keyword=data format)
! (print all EXIF tags, in tag_number data format)
#hhhh (print data for EXIF tag #hhhh)
ImageWidth
ImageLength
BitsPerSample
Compression
PhotometricInterpretation
FillOrder
DocumentName
ImageDescription
Make
Model
StripOffsets
Orientation
SamplesPerPixel
RowsPerStrip
StripByteCounts
XResolution
YResolution
PlanarConfiguration
ResolutionUnit
TransferFunction
Software
DateTime
Artist
WhitePoint
PrimaryChromaticities
TransferRange
JPEGProc
JPEGInterchangeFormat
JPEGInterchangeFormatLength
YCbCrCoefficients
YCbCrSubSampling
YCbCrPositioning
ReferenceBlackWhite
CFARepeatPatternDim
CFAPattern
BatteryLevel
Copyright
ExposureTime
FNumber
IPTC/NAA
EXIFOffset
InterColorProfile
ExposureProgram
SpectralSensitivity
GPSInfo
ISOSpeedRatings
OECF
EXIFVersion
DateTimeOriginal
DateTimeDigitized
ComponentsConfiguration
CompressedBitsPerPixel
ShutterSpeedValue
ApertureValue
BrightnessValue
ExposureBiasValue
MaxApertureValue
SubjectDistance
MeteringMode
LightSource
Flash
FocalLength
MakerNote
UserComment
SubSecTime
SubSecTimeOriginal
SubSecTimeDigitized
FlashPixVersion
ColorSpace
EXIFImageWidth
EXIFImageLength
InteroperabilityOffset
FlashEnergy
SpatialFrequencyResponse
FocalPlaneXResolution
FocalPlaneYResolution
FocalPlaneResolutionUnit
SubjectLocation
ExposureIndex
SensingMethod
FileSource
SceneType
将格式说明用引号括起来,以防止你的 shell 误解任何空格和方括号。
可以使用以下特殊格式语法,输出文件中包含的 IPTC 信息:
%[IPTC:dataset:record]
从以下选择 dataset 和 record:
Envelope Record
1:00 Model Version
1:05 Destination
1:20 File Format
1:22 File Format Version
1:30 Service Identifier
1:40 Envelope Number
1:50 Product ID
1:60 Envelope Priority
1:70 Date Sent
1:80 Time Sent
1:90 Coded Character Set
1:100 UNO (Unique Name of Object)
1:120 ARM Identifier
1:122 ARM Version
Application Record
2:00 Record Version
2:03 Object Type Reference
2:05 Object Name (Title)
2:07 Edit Status
2:08 Editorial Update
2:10 Urgency
2:12 Subject Reference
2:15 Category
2:20 Supplemental Category
2:22 Fixture Identifier
2:25 Keywords
2:26 Content Location Code
2:27 Content Location Name
2:30 Release Date
2:35 Release Time
2:37 Expiration Date
2:38 Expiration Time
2:40 Special Instructions
2:42 Action Advised
2:45 Reference Service
2:47 Reference Date
2:50 Reference Number
2:55 Date Created
2:60 Time Created
2:62 Digital Creation Date
2:63 Digital Creation Time
2:65 Originating Program
2:70 Program Version
2:75 Object Cycle
2:80 By-Line (Author)
2:85 By-Line Title (Author Position) [Not used in Photoshop 7]
2:90 City
2:92 Sub-Location
2:95 Province/State
2:100 Country/Primary Location Code
2:101 Country/Primary Location Name
2:103 Original Transmission Reference
2:105 Headline
2:110 Credit
2:115 Source
2:116 Copyright Notice
2:118 Contact
2:120 Caption/Abstract
2:122 Caption Writer/Editor
2:125 Rasterized Caption
2:130 Image Type
2:131 Image Orientation
2:135 Language Identifier
2:150 Audio Type
2:151 Audio Sampling Rate
2:152 Audio Sampling Resolution
2:153 Audio Duration
2:154 Audio Outcue
2:200 ObjectData Preview File Format
2:201 ObjectData Preview File Format Version
2:202 ObjectData Preview Data
Pre-ObjectData Descriptor Record
7:10 Size Mode
7:20 Max Subfile Size
7:90 ObjectData Size Announced
7:95 Maximum ObjectData Size
ObjectData Record
8:10 Subfile
Post ObjectData Descriptor Record
9:10 Confirmed ObjectData Size