⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://usage.imagemagick.org/formats/index.html)

ImageMagick 示例 -- 常见图像格式

ImageMagick 示例:前言与索引
常见图像文件格式简要总结
GIF 图像文件格式

常见图像文件格式简要总结

关于读取和写入图像格式的介绍,请参见 图像文件格式。而所有 ImageMagick 文件格式的列表则在 IM 图像格式页面 给出。以下是对最常见的"普通"图像文件格式的一个非常快速的总结,以及它们的一般优缺点……

GIF
这种格式极为常见,存在的时间已经很长,因此所有图像处理程序都能理解它。但它只能使用有限的颜色数量(256 色的颜色表),并且只以 8 位质量保存。然而,它内置的游程编码(run-length encoding)使其能够非常高效地保存只有少量颜色的图像。虽然该格式具有透明度,但它只理解布尔(开/关)透明度,因此会遭受"锯齿"或"jaggies"的困扰。当带有细线条的纯文本保存为透明 GIF 图像时会严重劣化。此问题唯一的解决办法是将 GIF 图像绑定到使用它的网页的特定背景上。GIF 格式可以保存多张图像以形成动画序列,为此还会保存图像画布尺寸和偏移(页面)信息。但请注意,不支持负偏移,尝试使用负偏移会将该偏移重置为零。它最适合用于卡通、线条图和小图标这类颜色有限的小图像,这些图像能让它很好地压缩。但只要有 PNG 这样更新的格式可用,就应避免使用它。
JPEG
完全不处理透明度。该图像等同于使用 "[-alpha off](https://imagemagick.org/command-line-options/#alpha)" 操作来移除 alpha 通道,因此任何背景透明度通常会变成黑色,具体取决于用于生成该图像的图像处理方式。这种格式还是"有损的",会在锐利的线条和边界处产生边缘效应,因此不应用于任何中间图像处理,或图像原件的存储(除非它们本来就是这种格式)。它非常适合现实生活照片的长期存储,但如果你打算进一步处理图像,或图像包含大面积纯色区域,则应避免使用它。
PNG
这种格式旨在最终取代 GIF 和 TIFF 等较旧的格式。它是一种现代格式,能够处理 16 位质量,具有四个颜色通道,从而允许充分使用半透明颜色。它还包含大量无损图像压缩选项。它最大的缺点是它仍然相对较新,以至于 Microsoft IE(v6)Web 浏览器无法自动正确处理它。不过该问题已有修复方案可用。该格式不保存画布尺寸信息(GIF 会保存),但它会保存画布偏移,甚至是负偏移(GIF 不会),尽管某些 Web 浏览器在使用负偏移时会出现问题,因此不推荐将其用于要在浏览器中显示的最终图像。对于保存中间的"分层"图像而言,保存负偏移的能力可能非常重要,且往往比它不保存画布尺寸信息这一点重要得多。
MNG
这是 PNG 的多图像格式,能够实现达到影片级质量与速度的动画。我想要一个使用 MNG 的简单示例,所以如果你有,请邮件给我。 MNG 动画格式似乎正在变得过时,已被一些 Web 浏览器(例如 FireFox)放弃。
TIFF
这是一种图像交换格式,是在还没有任何正经图像格式可用的时代为在程序之间传输高质量图像而开发的。不幸的是,由于这样的开端,该格式被以杂乱无章的特性和压缩样式加以修改,没有任何程序能理解全部这些。该格式如今基本上只被 Windows 平台上的 "[Photoshop](http://www.adobe.com/products/photoshop/)" 使用,而这也是唯一为 TIFF 图像格式提供某种标准参考的来源。TIFF 文件可以处理多张图像,不过除 IM 之外几乎没有什么应用程序能处理多图像 TIFF。一般来说,除非将 TIFF 图像的内部格式保持得相对基础,否则无法保证一个程序生成的 TIFF 文件能被另一个程序使用,包括 IM 甚至 "[Photoshop](http://www.adobe.com/products/photoshop/)" 本身。因此我根本不推荐这种格式!我建议你使用 TIFF(或 JPEG)以外的某种格式,尤其是用于图像的长期存储。我关于该格式及其问题的少量笔记在下面的 杂项格式,TIFF 部分提供。这些使用笔记是在 IM 邮件列表和论坛中找到的,因为我自己不使用、也不需要使用 TIFF。
视频格式
其他影片级质量的动画格式,一般基于使用有损压缩来缩小影片的大小(和质量)。这两种格式都处于不断变化、改进和增加安全限制特性的状态,使得任何形式的处理都很困难。最近一次统计时,有 200 多种视频格式"编解码器(codec)"出于各种目的被普遍使用。因此 IM 不直接处理这种格式,而是依赖其他软件包来处理动画中各个帧的处理(进出)。这些"委托(delegate)"程序包括 "mpeg2decode"、"mpeg2encode" 和 "mplayer"。参见下面的 MPEG、M2V 和 AVI)。

| 某些系统(如 ubuntu)使用安全策略禁用了特定图像文件格式的使用。键入magick -list policy 可查看你系统上存在哪些策略以及它们的设置来源。
---|---


GIF 图像文件格式

GIF 格式是一种广为人知的图像文件格式,因为它已经存在了非常非常非常久的时间(从 1980 年代末开始)。对于要在涉及透明度或图像动画的网页上显示的图像,它常被选用。它也几乎是唯一一种被所有 Web 浏览器绝对普遍理解的格式。不幸的是,除了线条图、图形、示意图和卡通之外,它并不是一种很好的格式。也就是说,因为它最多只能使用 256 种颜色,其中通常有一种被标记为透明。将图像中某种特定颜色标记为透明有一些缺点。如果选择用作透明的颜色不当,可能会导致图像的其他部分在并非有意的情况下变为透明。必须小心确保这种情况不会发生。此外,透明能力是"布尔型"的,这基本上意味着它要么完全开,要么完全关。半透明颜色根本不可能实现,如果存在的话,需要将其变为透明或不透明。这意味着该格式无法对图像边缘提供任何形式的抗锯齿,通常会导致严重的"锯齿"现象。(参见 抗锯齿)由于"GIF"图像格式的颜色限制带来了如此多的问题,尤其是对于像 ImageMagick 这样的高质量图像处理软件包,我想首先郑重声明……

如果可能,请尽量避免使用 GIF 格式。
如果你必须使用它,请仅将其作为最后一步。

最后,在很长一段时间里,GIF 使用的压缩算法是受专利保护的。因此它无法被许多图像处理程序(例如 ImageMagick)使用。所以非常旧的 IM 程序会输出未压缩的 GIF 格式图像,从而占用比应有更多的磁盘空间。你可以使用诸如 "**[Gifsicle](http://www.lcdf.org/gifsicle/)**" 或 "**[InterGIF](http://utter.chaos.org.uk/~pdh/software/intergif.htm)**" 这样的 GIF 批量压缩程序来解决这个问题。不过由于该专利已于 2004 年年中完全到期,当前发布的 IM 已重新启用了 GIF 图像压缩。该图像压缩也相当简单,在具有大面积纯色、不变颜色的图像上效果最好。或者在相同颜色集合的简单重复图案上效果最好,例如你使用 有序抖动(不是 IM 中的默认抖动)所得到的那种。最后,GIF 图像可以在一个文件中保存多张图像。这被用来生成 GIF 动画,几乎所有 Web 浏览器都能理解,因为该技术最初是由非常古老的"Netscape"浏览器引入的。总结 GIF 图像文件格式凭借其受限的颜色表、布尔透明度和简单的压缩(如果启用),使其非常适合小图像,例如缩略图,尤其是具有大面积纯色的"卡通式"图标、徽标和符号图像。它的动画能力也使其成为生成你在万维网上随处可见的那种花哨、吸引眼球的徽标和广告的理想方法。对于其他任何用途,它的局限性使其成为一种糟糕的图像文件格式,你可能更适合转向 JPEG、PNG 或视频图像格式来满足你的需求。

GIF 受限的颜色表

FUTURE: color reduction examples -- reference basic color dithering
Ensuring that a specific color is present in the final GIF image
Map color tables to color reduce.
See [Color Quantization](quantize.html#colors).

参见 高级 3-D 项目符号脚本编写,了解在一系列颜色范围内生成多张图像的示例。这种技术也可用于将你的图像自动魔法(auto-magick)成适用于许多不同背景颜色和图案的多张图像。

GIF 透明色

例如,这里我们使用 identify 来提取透明色,以及某个特定 GIF 图像文件用来表示透明的颜色表。该 perl 脚本仅提取感兴趣的特定字段(可能跨多行)。 | |

  magick identify -verbose hand_point.gif |\
      perl -0777 -ne 's/^  //gm; \
            print $& while /^(Colors|Alpha|Colormap):.*?(?=^\S)/gms'

[IM Output]
| [IM Output]


如你所见,这张图像使用了一种透明灰色('#CCCCCC00'),并且这种颜色在颜色表中有它自己单独的条目。你还可以看到,尽管这张图像只用了 5 种颜色(其中一种透明),所使用的颜色表却是 8 种颜色的。这是因为 GIF 文件格式只能使用大小为 2 的幂的颜色表。也就是说,颜色表的大小始终是 2、4、8、16、32、64、128 或 256 个颜色条目。因此最后 3 个颜色表条目未被使用。实际上它们只是没有被引用。在某些情况下,这些未使用的条目可能不是颜色表中的最后三个条目,而且实际上可能包含任何颜色值。你实际上还可以有重复的颜色值,不过如果 IM 以某种方式处理了图像,它通常会移除任何此类重复的颜色条目。从 IM 版本 6.2.9-2(以及某些更旧的版本)起,每当 IM 读取、处理并写入 GIF 图像时,它都会保留颜色表,更具体地说是透明色值。 | |

  magick hand_point.gif    -fill white -opaque wheat   hand_white.gif
  magick identify -verbose hand_white.gif |\
      perl -0777 -ne 's/^  //gm; \
            print $& while /^(Colors|Alpha|Colormap):.*?(?=^\S)/gms'

[IM Output]
| [IM Output]


如你所见,尽管图像被修改了(所有 'wheat' 颜色的像素都被替换为 'white' 颜色),所使用的透明色仍被保留了下来。然而,如果最终图像没有透明度,颜色表中的透明色条目('Alpha:')就会被完全移除。 | |

  magick hand_point.gif   -background white -flatten    hand_flatten.gif
  magick identify -verbose hand_flatten.gif |\
      perl -0777 -ne 's/^  //gm; \
            print $& while /^(Colors|Alpha|Colormap):.*?(?=^\S)/gms'

[IM Output]
| [IM Output]


如果你想更改 GIF 文件格式所使用的透明色,可以使用 "[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)" 输出设置(IM v6.2.9-2 添加)。例如…… | |

  magick hand_point.gif -transparent-color wheat  hand_wheat.gif
  magick identify -verbose hand_wheat.gif |\
      perl -0777 -ne 's/^  //gm; \
            print $& while /^(Colors|Alpha|Colormap):.*?(?=^\S)/gms'

[IM Output]
| [IM Output]


如你所见,尽管结果与原图在视觉上没有差别,透明色却被更改为了 'wheat' 颜色的全透明版本。如果你仔细看,还会发现图像的颜色表中现在有两种 'wheat' 或 '#F5DEB3' 颜色。也就是说,一种透明的 wheat 和一种不透明的 wheat。从 IM 版本 6.2.9-2 起,这不构成问题。不过 GIF 图像文件格式只能定义一种透明色。你为什么要这样做呢?因为某些非常旧的 Web 浏览器和图形程序不理解 GIF 透明度。所以此选项让你设置在那种情况下透明区域应为什么颜色。透明色的典型选择是用于现代浏览器的 'white',或者更常见的 'grey75'('#BFBFBF'),这是最初的 "mosaic" Web 浏览器的页面颜色。其他流行的透明色选择有 'grey'('#BEBEBE')和 'silver'('#C0C0C0'),上面那张'手'的图像用的就是后者。这说明灰度颜色范围中那个特定区域作为透明色有多受欢迎。FUTURE: add link to color selection. 在 IM v6.2.9-2 之前,以及在创建 "[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)" 输出设置之前,IM 通常会将图像的透明度保存为特殊颜色 'none'(全透明黑色),这在透明度失效时不是特别好看。
请注意,设置 "[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)" 并不会给 GIF 图像添加任何透明度,也不会将指定颜色魔法(magick)成透明。该选项所做的只是指定在 GIF 图像中用于表示透明颜色的颜色索引处,颜色表中应放置什么颜色。如果你想将某个特定(精确)颜色变为透明,请使用 "[-transparent](https://imagemagick.org/command-line-options/#transparent)" 颜色替换运算符

GIF 布尔透明度

因为 GIF 格式不理解半透明颜色,而 ImageMagick 默认会将半透明颜色作为其常规 抗锯齿方法 的一部分来生成,所以当你将图像保存为此格式时,它常常会显示得很糟糕。例如,这里我在透明背景上画一个简单的黑色圆。我还会生成图像边缘的放大视图,以便清楚地说明发生了什么。首先我用 PNG 格式输出…… |

  magick -size 60x60 xc:none -fill white -stroke black \
          -draw 'circle 30,30 5,20' circle.png
  magick circle.png -crop 10x10+40+3 +repage  -scale 600%  circle_mag.png

[IM Output] [IM Output]
如你所见,左边绘制的圆(PNG 格式)的边缘看起来非常干净(虽然略有模糊)。你可以在其放大图中看到半透明像素。现在让我们用 "GIF" 图像格式输出同一张图像…… |

  magick -size 60x60 xc:none -fill white -stroke black \
          -draw 'circle 30,30 5,20' circle.gif
  magick circle.gif -crop 10x10+40+3 +repage  -scale 600%  circle_mag.gif

[IM Output] [IM Output]
结果是,圆的外缘有非常明显的阶梯状效果,而内部仍保持适当的抗锯齿。基本上,PNG 格式可以保存半透明像素信息,而 GIF 不能。GIF 图像格式只能保存单一的纯透明色。换句话说……

GIF 格式具有开/关式(布尔型)透明度

如果你更仔细地查看生成的 GIF,会发现半透明像素可能要么变成全透明,要么变成全不透明。 | _ImageMagick 对半透明像素究竟做了什么,取决于你使用的 IM 版本。长期以来它都没有被恰当地定义,某个版本所做的事情往往取决于因用户的错误报告而应用的最后一个"bug 修复"。

从 v6.2.9-6 起,ImageMagick 默认应当在 50% 的级别上对 GIF 和 XPM 图像格式进行阈值处理。这已成为图像处理程序所采用的公认标准,同时仍允许你设置自己的方法来应对 GIF 文件格式的透明度问题。
---|---
| _由于 GIF 的限制,IM 在保存为 GIF 文件格式之前会执行以下一组操作……

_-channel A -threshold 50%
    if (fully-)transparent pixels are present it then...
      -quantize transparent -colors 255
    otherwise if no transparent pixels present...
      -colors 256_

_如果图像中存在的颜色少于那么多种,-colors 量化过程会自动什么都不做。如果图像有一个有效的颜色表(如通过 "+/-map" 分配的),它也不会做任何事。

它也不会尝试为多图像 GIF 文件使用一个公共颜色表。因此,如果各帧之间的颜色差异很大,可能会为保存到 GIF 文件格式中的每张单独图像添加一个局部颜色表。

此外,上面所用的设置不是永久的,只是针对正在保存的图像临时使用的。也就是说,如果你使用 "-write image.gif",处理过程中所用的设置不会影响之后的操作。_
---|---
你可能想自己进行阈值处理,如果你不确定自己使用的是什么版本的 IM(尤其是较旧的版本),则推荐这样做。 |

  magick -size 60x60 xc:none -fill white -stroke black \
          -draw 'circle 30,30 5,20' \
          -channel A -threshold 50%  circle_threshold.gif
  magick circle_threshold.gif -crop 10x10+40+3 +repage \
          -scale 600%   circle_threshold_mag.gif

[IM Output] [IM Output]
上面的示例在 alpha 通道上执行了与 IM 现在自动执行的相同的 "[-threshold](https://imagemagick.org/command-line-options/#threshold) 50%",也就是说,如果一个像素的透明度超过 50%,它将被变为全透明(如果定义了 "[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)" 设置,则使用该设置给出的颜色)。不过现在你可以随意控制阈值级别了。在 50% 阈值处理 alpha 通道对大多数类型的图像效果都很好。尤其是那些有简单边缘的图像,但当你需要处理大面积的半透明像素时,该技术会相当严重地失效。这就是接下来大多数关于 GIF 处理的示例所要探讨的。例如,假设我们想保存一张带有大面积 模糊半透明阴影 的图像,比如这张图像(PNG 格式)…… |

  magick -size 70x60 xc:none -font Candice -pointsize 50 \
          -fill black -annotate +10+45 'A' -channel RGBA  -blur 0x5 \
          -fill white -stroke black -draw "text 5,40 'A'"   a.png

[IM Output]
如果你直接把这个字母魔法(magick)成 GIF 格式,甚至使用 "[-threshold](https://imagemagick.org/command-line-options/#threshold)" 操作来控制布尔透明度,你都会大失所望。 |

  magick a.png  a.gif
  magick a.png -channel A -threshold 75%   a_threshold.gif

[IM Output] [IM Output]
第一张图像是常规地保存为 GIF 格式,如你所见,它在 '50%' 处对半透明像素进行了阈值处理;第二张图像在 '75%' 处进行阈值处理,让更多半透明像素变为全不透明(即可见)。如果你只想移除所有半透明像素(例如阴影),可以尝试类似 "-threshold 15%" 的操作,以移除几乎所有半透明像素。 |

  magick a.png -channel A -threshold 15%   a_no_shadow.gif

[IM Output]
针对 GIF 布尔透明度问题的大多数其他解决方案,是将图像无法分割地绑定到它所在网页的背景颜色上。实现这一点的方法复杂而棘手,这就是我们现在要探讨的内容。 纯色背景上的 GIF 我们真正想要的是以某种方式保留半透明和抗锯齿像素的明暗渐变,并仍能在 WWW 上很好地显示它。要做到这一点,我们必须耍点小聪明。典型的解决方案是将图像匹配到你打算用来显示该图像的背景上。这很简单,只需在将图像保存为 GIF 格式之前,把图像叠加到适当颜色的背景上即可。这就消除了对任何形式透明度的需要,整件事就变成了一个非问题。当然,颜色数量有限仍然是个问题,但往往不是大问题。 |

  magick a.png -background LightSteelBlue -flatten  a_overlay.gif

[IM Output]
看,几乎完美!当然,要让这种方法正确工作,你需要确切知道图像将被用在什么背景颜色上。而且在我们完成之后,该图像在任何其他背景上都不会太好看。这是个很大的牺牲。 背景图案上的 GIF 但是,如果你为背景使用的是某种图案,而不是简单的纯色呢?你可以尝试将叠加图层定位到背景图案的副本上,使结果图像中的图案与网页的图案相匹配。然而这需要大量的试错才能让图像中的背景与网页对齐。而且你只能保证它对某个特定浏览器有效,并且只对该浏览器的那个特定版本有效。对网页来说这不是个好主意,所以连试都别试。我当然不会试。与其尝试与背景图案完美匹配,不如就把图像叠加到至少与我们打算使用的背景相匹配的颜色上。例如,让我们把图像叠加到一种"典型的"气泡状背景图案上。但首先我们需要知道这个背景的平均颜色。找到这个颜色的一个简单方法是把图像 缩放 到单个像素,然后读取所得到的颜色。

  magick bg.gif -scale 1x1\! -depth 8 txt:-

   [![\[IM Text\]](../static/img/formats/bg_color_avg.txt.gif)](../static/img/formats/bg_color_avg.txt)

关于所使用的特殊 "txt:" 输出格式的更多信息,参见 IM 像素枚举文本格式。现在让我们使用 "[-flatten](https://imagemagick.org/command-line-options/#flatten)" 设置图像的背景透明度。 |

  magick a.png  -background '#BABBD7' -flatten  a_bg.gif

| | [IM Output]

我已经设置好网页,将我们的图像叠加在那个背景上,尽管那个背景并不是图像本身的一部分。虽然所用的背景颜色与背景图案的总体颜色相匹配,但它周围仍有一个非常明显的纯色矩形,里面没有背景图案。一个实用的解决方案是把我们叠加的颜色声明为 GIF 输出中的 "[-transparent](https://imagemagick.org/command-line-options/#transparent)" 颜色。通过这样做,我们消除了图像的"方块感"。此外,添加一个小的 模糊因子(fuzz factor) 可以改善结果,并以与上面阈值处理相同的方式调整透明色所占用的空间量。 |

  magick a.png  -background '#B9BBD6' -flatten \
          -fuzz 5%   -transparent '#B9BBD6'   a_bg_trans.gif

| | [IM Output]

这通常足以处理大多数 GIF 图像中的透明度,尽管它确实会把图像绑定到特定的背景颜色上。本质上,我们是用透明度来给图像设定一个基本的轮廓形状,而不是真正的透明度。通过为叠加和 GIF 透明度使用一种与背景图案相匹配的颜色,意味着不再能清楚地看出图像到哪里结束、背景图案从哪里开始。
不过,使用 "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" 设置时要小心,太多的话你最终得到的可能不只是图像外部变透明! |

  magick a.png  -background '#B9BBD6' -flatten \
          -fuzz 25%  -transparent '#B9BBD6'   a_bg_overfuzz.gif

| | [IM Output]

如果你在图像本身内部使用了接近背景颜色的颜色,它也会失败。因此这种技术 不推荐 用于一般图像,仅适用于特定情况。为了解决这个问题,我们使用 '[-alpha floodfill](draw.html#alpha)' 来设置我们想要透明的区域。 |

  magick a.png  -background '#B9BBD6' -flatten \
          -fuzz 25%  -draw 'fill none alpha 0,0 floodfill' a_bg_none.gif

| | [IM Output]

现在,只要我们图像的边界不"泄漏",我们就可以在图像内部使用与背景相似的颜色,而不会因为"过度模糊"而让它们变透明。当然,如果我们的图像中有"洞",那么那些洞也必须处理。在这种情况下,前面的"模糊透明度"方法可能效果更好。说过处理 GIF 透明色很简单吧!才不是呢!
对于具有锐利抗锯齿边缘的图像,一种替代技术是简单地添加一圈最小的背景颜色轮廓。参见 轮廓或光晕透明度
移除背景颜色……尝试从现有 GIF 图像中移除特定的背景颜色并不容易。如果叠加的图像本身也包含背景颜色,就尤其困难,因为这样你就不太清楚什么是背景、什么不是。最好的解决办法是获取同一 GIF 在两种不同且众所周知的背景颜色上叠加的副本。有了这样两张图像,你就可以完美地恢复原始的叠加图层及其所有半透明像素。参见 使用两个背景进行背景移除。如果你没有这样两张图像,那么你无法完美地恢复图像的半透明度,但有一些技术可以完成一项虽不完美但还算合理的工作。为此,请参见 背景移除 的其他部分。
用于非特定背景的 GIF(或对透明度进行抖动)

FUTURE: This will move into a more generalise (non-GIF specific), alpha
dithering section.

上述方法最大的问题是,它只有在你恰好知道图像将被用在什么颜色的背景或背景图案上时才有效。如果你不知道,也并非全无办法。如你在上面所见,阈值处理对于具有非常大透明区域的图像(例如模糊阴影)效果不佳。但另一种被称为抖动(dithering)的技术可以做到,而且不需要了解它将被使用的背景。基本上,抖动将透明度限制为开/关值,通过使用像素图案在更大的区域上创造出半透明的效果。换句话说,它伪造了半透明度。这种方法曾在如今被称为 "Opossum 示例" 的内容中被举例说明。不幸的是,这些示例实际上并没有给出生成示例所用的命令。为完整起见,我将尝试在这里重新演示它们。"[-monochrome](https://imagemagick.org/command-line-options/#monochrome)" 运算符将图像中的所有颜色转换成纯黑白的 "Floyd-Steinberg 误差校正抖动"。然而,由于它将灰度图像转换成纯黑白颜色,我们需要从图像中提取一个 alpha 通道蒙版,对其进行抖动,然后再放回图像中。 |

  magick a.png \( +clone -fx a -alpha off -monochrome \) \
          -compose CopyOpacity -composite   a_dither.gif

[IM Output]
以类似的方式,还有几个其他的抖动运算符可以使用 "[-channel](https://imagemagick.org/command-line-options/#channel)" 设置(不同于 "[-monochrome](https://imagemagick.org/command-line-options/#monochrome)")将其限制为仅作用于 alpha 通道。

  magick a.png -channel A -ordered-dither   o2x2   a_ordered_2x2.gif
  magick a.png -channel A -ordered-dither   o3x3   a_ordered_3x3.gif
  magick a.png -channel A -ordered-dither   o4x4   a_ordered_4x4.gif

  magick a.png -channel A -ordered-dither  checks  a_halftone_2.gif
  magick a.png -channel A -ordered-dither  h4x4a   a_halftone_4.gif
  magick a.png -channel A -ordered-dither  h6x6a   a_halftone_6.gif
  magick a.png -channel A -ordered-dither  h8x8a   a_halftone_8.gif


  magick a.png -channel A -random-threshold  5x95% a_random_5x95.gif

  magick a.png -channel A -random-threshold  5x70% a_random_5x60.gif

  magick a.png -channel A -random-threshold 50x95% a_random_50x95.gif

  magick a.png -channel A -random-threshold 45x55% a_random_45x55.gif
  magick a.png -channel A -random-threshold 50x50% a_random_50x50.gif

[IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

如你所见,"[-ordered-dither](https://imagemagick.org/command-line-options/#ordered-dither)" 生成了一种透明和不透明颜色的图案来表示整体的透明度。然而这会产生非常明显的规则图案。不过,如果你使用一种与正常背景相似但更暗的阴影颜色,那么你可以让这种图案几乎完全不可见。'checks' 图案(第二行的第一张图像)特别值得关注,因为它是一种非常简单的 3 级图案,非常干净、整洁。 | _"[-ordered-dither](https://imagemagick.org/command-line-options/#ordered-dither)" 在 IM v6.2.8-6 中以"半色调(half-tone)"抖动图案进行了扩展。该运算符随后在 IM v6.3.0 中以命名的抖动图案被彻底修订(使用 "[-list](https://imagemagick.org/command-line-options/#list) threshold" 可查看完整列表)。你甚至可以生成你自己的抖动图案来产生其他特殊效果。更多细节参见 有序抖动示例有序抖动升级说明

在此次重新开发之前,参数只能由几何字符串 '2x2'、'3x3' 和 '4x4' 构成(这些仍然有效)。然而,其他任何内容当时都会被当作 "[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" 的参数处理,通常带来灾难性的后果。在非常旧的 IM 版本上使用此选项时需要小心。
---|---
另一方面,"[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" 产生一种高度可变的随机化抖动,每次运行都不同。不过,这种抖动算法的纯随机性往往会产生大块的像素"团块",而不是由 "Floyd-Steinberg" "[-monochrome](https://imagemagick.org/command-line-options/#monochrome)" 运算符生成的更平滑、算法化放置的抖动。但 "[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" 的最大优势在于它提供的限制控制。通过使参数非常严格(例如 '50x50%'),你可以把 "[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" 魔法(magick)成一个简单的 "[-threshold](https://imagemagick.org/command-line-options/#threshold)" 运算符。通过稍微放宽一点,你可以只随机化阈值限制的最边缘部分(例如使用 '45x55%')。 |
"[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" 的参数为 'PxQ',其中 P 是最小阈值,Q 是最大阈值('%' 符号是必需的)。所以 "5x95%" 表示任何低于 MaxRGB 5% 的都设为 0,任何高于 95% 的都设为 MaxRGB,否则我们在 MaxRGB 的 5% 到 95% 之间选择一个随机值,作为该像素要使用的阈值级别。在大多数情况下,"5x95%" 的参数值可能是最佳选择。_
---|---
你可以通过使用更暗的中间调颜色(如深灰色)而不是黑色作为阴影颜色来改善最终的外观。通过这样做,颜色会更容易融入背景,使抖动不像上面所示的那么明显。如果你确实大致知道背景颜色,你甚至可以使用该色调的更暗版本,使阴影更好地融合,而不必把自己限制在特定的背景色调上。算是把这两种方法稍微混合一下以改善整体结果。基本上,你为想做的事投入的工作越多,结果就越好。

FUTURE: dither example with a dither color matching the light blue background
of this web page.
非 ImageMagick 的 GIF 处理 giftrans 列出 GIF 图像的所有属性和颜色表。它还可以将特定的颜色索引设置为透明色,而不修改图像的颜色表排序,也不合并持有相同颜色的颜色索引(这不是推荐的情况)。我发现 IM 的 "magick identify" 命令在列出图像属性方面做得更好,包括图像动画中使用的 "Mosaic 应用程序扩展(Application Extension)" 里的"循环重复限制"。另请参见 "gif2anim" 脚本(见下文),它以前使用此程序来提取从各个"帧"重建 GIF 所需的 GIF 图像元数据。现在它只使用 "magick identify" 来提取这些元数据。
GIFsicle 这是一个通用图像优化程序,其最初目的是在 GIF 的压缩算法仍受版权保护时为其重新添加压缩。该程序还可用于添加注释、创建 GIF 动画,并以与 IM "[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)" 运算符相同的方式优化此类动画,不过还带有进一步的透明度优化,例如 LZW 压缩优化
InterGIF 一个与 GIFsicle 类似的程序,为处理动画 GIF 而设计。然而它只提供 透明度压缩优化。不过其他特性可能也有用。请把你的看法邮件给我。
gif2anim 一个 shell 脚本,它接收一个 GIF 动画文件,并提取所有各个帧图像,以及一个包含从提取的帧图像重建该动画所需的全部 IM "magick 设置的 ".anim" 文件。
anim2gif 上述脚本的逆操作,它接收一个包含全部 IM "magick 设置的 ".anim" 文件,并重建一个 GIF 动画图像。此脚本对于研究、编辑、调整和合并 GIF 动画文件非常有用。基本用法参见 动画列表信息。另请参见 追加动画(时间同步),了解其使用的实际示例。

GIF 图像偏移处理

虽然 GIF 格式会将带偏移的图像作为其图像动画处理的一部分保存下来,但它不会保存负偏移。任何尝试将负偏移保存到 GIF 图像中的操作都会导致该偏移被重置为零。在设计 GIF 图像动画时,这可能是个真正的麻烦。如果给 Internet Explorer Web 浏览器一张其"页面偏移"将图像置于"页面画布尺寸"之外某处的 GIF 图像,它会忽略页面尺寸和偏移,把它当作没有这种偏移那样显示。另一方面,古老的 Mozilla Web 浏览器则会只显示图像画布,并将偏移应用于图像。这可能导致显示出一个没有图像数据的空画布,虽然这是正确的,却可能出人意料。如果图像完全包含在该页面画布上,两者都会使用页面画布尺寸并带上适当的页面偏移来显示图像。

相关的 GIF 输出格式

GIF87:以较旧的 GIF 87a 格式输出图像。

如果 "Mozilla" Web 浏览器看到这种较旧的格式,它会完全忽略图像的页面几何,不会使用更大的"页面"框架,也不会对图像使用图像偏移。IM 版本 6.0.4 及更早通常会生成 GIF89a 格式。但如果图像是 GIF 动画,并通过 +adjoin 被拆分成单独的图像,IM 会使用 GIF87a,导致在 Web 浏览器中显示时出现不一致的结果。IM 在 v6.0.4 之后将始终生成 GIF 89a 图像格式文件,除非用户特别要求较旧的 "`GIF87:`" 输出格式。

JPEG 图像文件格式

这种格式与上面的 GIF 格式 一样常见。但 GIF 是为简单的小型"卡通式"图像设计的,而 JPEG 是为具有大量不同颜色及颜色明暗变化的大型现实生活图像(例如照片)设计的。JPEG 文件格式的一个关键特性是它的压缩,它在保持图像对人眼可接受的同时缩小图像大小。这是一个非常复杂的过程,超出了本讨论的范围。关于这一过程及其效果的更多信息,参见 JPEG 压缩介绍。还有一个很棒的细致讲解,在 YouTube 视频 JPEG DCT, Discrete Cosine Transform (JPEG Pt2)- Computerphile 中。不幸的是,为了很好地压缩图像,该算法会有意地 丢失 信息。所保存的 不是 内存中那张相同的图像;图像中某个特定像素或某个区域的颜色通常 不会 与所保存的颜色完全相同。在图像中物体的边缘附近尤其如此。所以先简短地警告一句……

IM 是一个通用的栅格图像处理器,用于修改图像。
它不会进行无损的 JPEG 修改。

如果你对无损处理感兴趣,参见 非 IM 的 JPEG 处理
如果对 JPEG 图像进行的更改使得对顶部或左侧边界的更改量不是 8 的倍数,这种有损行为会变得更加明显。当这种情况发生时,JPEG 压缩的"块"或"单元"会完全不同,这可能导致最终保存的图像大小大幅增加。也就是说,诸如 chop、trim、shave、border、frame、extent 等操作(参见 裁切与加边操作),它们能以一个不是 8 的像素偏移移动图像数据。更多细节参见 IM 论坛讨论 Cropping an image result in an unexpected increased file
通常这种 JPEG 数据的 有损 性质不太明显。然而,当你多次加载和保存一张 JPEG 图像,或者对带有锐利颜色变化的示意图使用非常低的质量时,它可能变得明显。不过,只要你不一遍又一遍地加载或重用 JPEG 图像(保留并从原始源应用各项操作),即使是它不太擅长处理的图像类型,它仍是一种很好的文件格式。作为这种 JPEG 有损性质的一个示例,这里我生成一张由两个渐变拼接在一起的简单图像。渐变提供了 JPEG 能很好处理的平滑颜色变化,但两个渐变之间锐利的颜色变化处理得不好。

  magick -size 5x10  gradient: gradient:blue-navy  +append jpg_lossy.gif
  magick jpg_lossy.gif                  jpg_lossy.jpg

[IM Output] [IM Output]

第一张图像是该图像未失真的 GIF 格式版本的放大视图(点击图像可查看或下载未放大的视图)。它只包含 20 种颜色,所以在这种情况下 GIF 格式可以完美地处理该图像,实际上生成的文件大小非常小(见下表)。另一方面,该图像的 JPEG 版本显示出 JPEG 压缩为更好地压缩而添加到所保存图像中的明显颜色失真。失真在蓝色颜色通道中最大,这并不意外,因为蓝色不被人眼很好地分辨。也就是说,人眼往往会自然地"扩散"蓝色,所以 JPEG 算法利用了这一点(内部使用 YCbCr 色彩空间)。事实上,如果没有上面所用的放大,你会很难看到这种效果。让我们看看质量对图像的影响。

  magick jpg_lossy.gif   -quality 100%  jpg_lossy_100.jpg
  magick jpg_lossy.gif   -quality  80%  jpg_lossy_80.jpg
  magick jpg_lossy.gif   -quality  50%  jpg_lossy_50.jpg
  magick jpg_lossy.gif   -quality  20%  jpg_lossy_20.jpg
  magick jpg_lossy.gif   -quality   5%  jpg_lossy_5.jpg

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

如果你仔细看上面的第一张结果图像(我们以 '100%' 即最高质量保存了测试图像),仍然存在一些轻微的颜色失真。它很难看到,但确实存在。另一方面,对 JPEG 图像使用逐渐降低的 "[-quality](https://imagemagick.org/command-line-options/#quality)" 设置会使这种颜色失真更大、更明显。不仅如此,它还会设置一种边缘的"阴影"现象,产生从锐利边缘向外扩散的颜色变化的"波纹"。这种效果通常被称为 振铃伪影(Ringing Artefacts)。然而,使用压缩的原因在于所得图像的大小会非常显著地变小,至少一开始如此。这里是结果及其以字节为单位的大小的文件列表。

[IM Text]

请注意,本例中 GIF 图像非常小,因为大"块"颜色在 GIF 中压缩得极好。随着 JPEG 质量降低,图像的大小也会变小。当用户或源图像格式文件都没有设置 JPEG 质量时,默认质量设置约为 92%,这是非常高的质量。然而,使用低于 '50%' 的质量设置时,就文件大小的节省而言,图像大小不会变得小多少,只会得到更加逐步劣化的图像。这是一个收益递减的过程。总结如下……

JPEG 会丢失信息,在保存时使图像劣化。
在处理过程中,请对中间图像使用其他某种格式。
只对最终图像使用 JPEG 格式,而不要用于进一步处理。

JPEG 也不适合具有锐利颜色变化的人工图像,例如线条图、示意图,或卡通式的图标、文本和符号。这类颜色数量少的图像最好使用调色板图像格式来保存,例如 GIF 或 PNG8。一种新的 JPEG 图像格式 Jpeg2000 正在变得可用,它确实允许无损 JPEG 压缩。然而这需要同时安装 'JasPer' 库。要使用这种特殊格式,你还需要使用 "-compress jpeg2000" 选项或保存为 JP2 文件格式,这样 IM 才会调用正确的库。

JPEG 透明度 - 不支持

除了压缩之外,JPEG 用户面临的另一个主要问题是

JPEG 不保存透明度

因此,虽然你可以把图像叠加到背景颜色或图案上再保存为 JPEG,但你无法给 JPEG 图像一个自由形状的边框或带有透视的洞。由于 JPEG 是为保存现实世界的图像、而非图像的局部而设计的,因此在该格式创建时,透明度并不是它所关心的问题。所以设计者从未考虑过包含 alpha 通道或文件格式中的其他透明度信息。例如,让我们把上面用过的带透明度的 PNG 直接魔法(magick)成 JPEG。

  magick a.png  a.jpg

[IM Output] [IM Output]

如你所见,所有透明部分都变成了黑色。但取决于图像来源(尤其是 GIF 图像),透明区域同样很容易变成某种随机的或其他不合适的颜色。如果这可能成为问题,最好的办法是让 IM 在将图像保存为 JPEG 图像文件格式之前 移除 alpha 透明度

JPEG 颜色失真(测试中)

如上所述,JPEG 使用的压缩算法是有损的。图像会被修改以让它更好地压缩,从而(但愿能)减少文件空间。究竟发生多少颜色失真取决于所使用的质量设置。例如,让我们看看 IM 内置的 "netscape:" 图像中有多少种颜色…… | |

  magick identify -format "Colors: %k" netscape:

| [IM Text]

如你所见,这张图像默认有 216 种颜色排列成一个大的矩形阵列。这种类型的图像 不是 一张很适合保存为 JPEG 格式的图像,而这恰好使它非常适合我们的目的。那么让我们看看这张图像保存为 JPEG 图像后会产生多少种颜色…… | |

  magick netscape: JPG:- |\
     magick identify -format "Colors: %k\nFile Size: %b" -

| [IM Text]

也就是说,默认情况下,保存的 JPEG 文件的颜色数量几乎是原来的 9 倍!尽管结果看起来仍像原图,但矩形区域的边缘附近会被添加颜色。以最高质量设置保存 不会 在不产生任何颜色失真的情况下保存图像…… | |

  magick netscape: -quality 100 JPG:- |\
     magick identify -format "Colors: %k\nFile Size: %b" -

| [IM Text]

如你所见,非常高的质量设置只会增加少数几种额外颜色,但图像仍会有轻微的(最小的)颜色失真。你还可以看到文件大小更大了,因为几乎无法实现什么压缩。现在让我们试试 "Lossless"(无损)…… | |

  magick netscape: -quality 100 -compress Lossless JPG:- |\
     magick identify -format "Colors: %k\nFile Size: %b" -

| [IM Text]

仍有颜色失真!显然我的 JPEG 库没有为无损编码打补丁。不过请记住,只有另一个打过补丁的库才能读取这样的无损 JPG 图像。作为替代,我建议你编译你的 IM 以使用 JasPer 库和较新的 JP2 图像文件格式。 | |

  magick netscape: JP2:- |\
     magick identify -format "Colors: %k\nFile Size: %b" -

| [IM Text]

如你所见,Jpeg2000 格式切换到了其他非有损的图像压缩方法,但默认不会使图像产生颜色失真。它还对图像执行了一些非常高的压缩方法。然而,对新的 JP2 格式使用较低的质量同样会引入颜色失真,以便生成更小的图像,就像普通的 JPEG 图像文件格式一样…… | |

  magick netscape: -quality 50% JP2:- |\
     magick identify -format "Colors: %k\nFile Size: %b" -

| [IM Text]

关于使用 JPEG2000 编码器的更多信息,参见 JPEG2000 编码参数文档

读取 JPEG 的控制选项

-define jpeg:size={width}x{height} 此设置是给 JPEG 图像库的一个提示,让它只读取足够多的输入(JPEG)图像文件,以创建一个至少为给定尺寸(width × height)或更大的图像。如果输入图像非常巨大,这可以大大减少 IM 在读取图像时所需的内存量,因为之后 IM 将处理一张更小的图像。这反过来可以极大地提高整个操作的速度。请记住,这只是对所需图像尺寸的一个提示,你不保证能得到这个尺寸,只是得到接近但大于该尺寸的某个尺寸。通常你会得到介于此尺寸与其两倍之间的某个尺寸,同时保持图像的宽高比。通常,在使用尺寸提示读取 JPEG 图像后,会立即将图像调整到其最终的"精确"尺寸。通常使用 "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" 同时也会剥离任何图像配置文件。例如……

    magick -define jpeg:size=64x64   jpeg_large.jpg jpeg_size_hint.jpg
    magick -define jpeg:size=128x128 jpeg_large.jpg \
                                   -thumbnail 64x64  jpeg_thumbnail.jpg

| _在 IM v6.5.6-0 之前,此编码器设置是从 "[-size](https://imagemagick.org/command-line-options/#size)" 设置中提取的。当用户使用 "[-size](https://imagemagick.org/command-line-options/#size)" 进行图像创建、但随后 JPEG 读取产生意外结果时,这会导致问题。因此它被改为一个特殊的编码器设置。

在较旧的版本上,你可能需要在读取 JPEG 图像之前使用 "[+size](https://imagemagick.org/command-line-options/#size) 重置 "[-size](https://imagemagick.org/command-line-options/#size)" 设置,否则 IM 可能无法完整地读取 JPEG 图像。


---|---
请注意,此修饰符会使 JPEG 库跳过整列和整行像素的读取。因此它会产生很像 采样缩放运算符 的效果,包括其强烈的 混叠伪影。因此,建议你至少指定图像最终"resize"尺寸的两倍,以避免此问题,正如上面示例所示。 | _请注意,缩略图缩放运算符 在进行极大规模的缩放操作时也使用相同的采样技术,以便在使用常规 resize 操作之前快速缩小图像的尺寸,不过它缩到最终图像尺寸的 5 倍而非 2 倍。尺寸的差异关乎最终图像的质量。

---|---
+profile '*' -strip 数码相机、扫描软件以及像 "photoshop" 这样的其他图像处理软件保存的 JPEG 图像,常常会向 JPEG 图像添加大量"程序注释"配置文件。这两个选项中的任何一个都会在图像读入后从图像中移除这些配置文件。"[+profile](https://imagemagick.org/command-line-options/#profile)" 运算符会从图像中移除所有颜色配置文件,而 "[-strip](https://imagemagick.org/command-line-options/#strip)" 会移除图像可能拥有的所有配置文件和元数据。另请注意,"[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)" 是一个 "[-resize](https://imagemagick.org/command-line-options/#resize)" 选项,它会同时执行 "[-strip](https://imagemagick.org/command-line-options/#strip)"。另请参见 创建缩略图-type TrueColorMatte 由于 JPEG 不保存任何形式的透明度,当它被读入时,将始终是全不透明的,并且在内存中没有 'alpha' 通道。此设置将强制在该选项之后读入的任何 JPEG 图像在内存中被添加一个全不透明的 'alpha' 通道。不过,更好的做法是在读取图像后使用 "[-alpha set](https://imagemagick.org/command-line-options/#alpha)" 或 "[-alpha](https://imagemagick.org/command-line-options/#alpha) set",因为它对其他图像格式的读写影响较小。更多信息参见 读取和写入时的图像类型Alpha Set

写入 JPEG 的控制选项

默认情况下,写回 JPEG 图像时会使用读取 JPEG 图像时找到的 "[-quality](https://imagemagick.org/command-line-options/#quality)" 和 "[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor)"。然而,这可能不会在磁盘上产生相同的文件大小,而且由于读取并重新保存一张 JPEG 图像,你仍将始终遭受进一步的图像质量损失。不过 JPEG 量化表不会被保留。

-quality {percent} 保存 JPEG 图像时可能更为重要的选项,因为它控制图像在保存到磁盘时被压缩多少。该值不是尺寸百分比,只是一个质量值。值越低,图像越小,丢失的图像信息越多,产生更多伪影,使图像劣化。

    FUTURE: VERY low quality example of a photo

注意:'100%' 的质量设置不保证在不损失任何质量的情况下保存图像,只是损失量最小。(参见下一个选项)注意:除非通过反复试验,否则你无法确定一个质量来得到特定的文件大小。从 75% 的 "[-quality](https://imagemagick.org/command-line-options/#quality)" 开始,检查所得到的文件大小。如果太大,把质量降低 10%;如果太小,则增加。在你得到质量的下限和上限之后,做一次二分查找来找到最匹配你期望文件大小的质量。总共五到六次尝试应该就足够了。 -define jpeg:extent={size} 从 IM v6.5.8-2 起,你可以为 JPEG 图像指定最大输出文件大小。该大小用一个后缀指定。例如 "400kb"。它的工作方式是生成 JPEG 图像的许多版本,对输出质量 "[-quality](https://imagemagick.org/command-line-options/#quality)" 设置做二分查找,直到它在不超过给定文件大小的前提下尽可能地接近该大小。它通过把图像反复写入一个临时文件来做到这一点,一旦它得到合适的质量大小,就把最终图像一次性输出到给定的输出文件名。因此,即使在把最终图像输出到管道或直接输出到网络(而不只是到真正的文件)时,输出也能正常工作。不过,由于 I/O 需求,不要指望这个过程会很快。也许慢 4 到 8 倍。如果你确实做了时间对比,请把你的结果邮件给我。 -compress LossLess 虽然 '100%' 的 "[-quality](https://imagemagick.org/command-line-options/#quality)" 设置仍可能产生略有不同的颜色(它仍然是"有损的"),但 "-compress LossLess" 选项会要求 JPEG 库在不丢失任何数据的情况下保存图像。因此,重新读取图像应当能完全恢复成它保存时的样子。警告:这只有在你的 JPEG 库已为"无损 JPEG"编码打过补丁时才有效,但 JP2 文件格式的使用已取代了这一点,所以此选项如今几乎不再有任何实际效果。此外,你 还必须 设置 "-quality 100%" 才能让它工作。虽然你直观上会以为以 'LossLess' 保存会自动意味着使用 100% 质量,但情况并非如此。这是为 JPEG 图像写入(一种按定义就是有损的格式)打上一个不寻常补丁的结果。当然,生成的文件可能比普通的 JPEG 图像大得多。此外,你最终会得到一个无损压缩的 JPEG,除了用类似"打过补丁"的 JPEG 库之外,你在任何地方都无法读取它。因此,"无损 JPEG" 不推荐 使用,应改用其他某种格式(如 PNG 或 JP2)。 -interlace Line 使用一种"渐进式 JPEG"样式,让你在大型 jpeg 图像仍在加载时就能看到它。另请参见下面在不进一步损失的情况下重新编码现有 JPEG 的非 IM 解决方案。 -sampling-factor {horizontal}x{vertical} 调整 JPEG 库用于色度下采样的采样因子。可以将其设置为 '2x1' 以创建 MPEG-2 动画文件。"2x2, 1x1, 1x1" 是 IM 的标准子采样方法,对应于 4:2:0,参见 Wikipedia, Chroma Sub-Sampling。然而,当"质量"为 90 或更高时,通道不会被子采样。基本上,它会定义处理的"块"或"单元"大小是 8 像素还是 16 像素。 -density {Xdpi}x{Ydpi} 虽然密度对所得图像的输出像素尺寸没有影响。但上述设置会被存储在 JPEG 图像文件格式的 JFIF 头中。不幸的是,如果图像中还存在一个特殊的 photoshop 专用配置文件('8BIM')中的密度,像 Photoshop 这样的某些程序会忽略此设置。密度实际上只在使用输出设备(例如打印机或显示器)时才重要,它允许这些设备显示按现实世界尺寸缩放的图像。例如,确保你扫描的照片或页面以正确的尺寸打印。关于密度的更多信息,参见 图像密度元数据重采样缩放-type TrueColor 对于只包含灰度值的图像,IM 会自动使用灰度的内部格式。此设置将覆盖此行为,强制 IM 始终生成彩色 JPEG 图像而非灰度图像。更多信息参见 读取和写入时的图像类型-define jpeg:optimize-coding=false 关闭对此图像计算最优霍夫曼编码表。该计算默认是开启的。它确实需要对图像额外扫描一遍来做所需的计算,但这是微不足道的。 -define jpeg:q-table={path} 定义一个包含自定义 JPEG 量化表的文件,采用 XML 格式。一个示例表通常安装在 "/etc/ImageMagick/quantization-table.xml",但它内置于 ImageMagick 中,因此通常不会被使用。关于生成表的大量讨论可在 数字图像处理论坛 中找到,具体讨论(在撰写时)见 JPEG Quantization TablesBetter JPEG quantization tables?Stupid PET Trick qtable of oneJPEG luma quantization table。此选项在 IM v6.5.7-8 中添加。

JPEG 质量与文件大小

对于给定质量,JPEG 文件的最终文件大小是不确定的。整个压缩过程如此复杂,微小的变化会对压缩产生天差地别的变化。这是一种"蝴蝶效应"。即使是相同的源图片、相同的质量,但使用不同版本的 IM、JPEG 库或其他图像处理程序,你也会在文件大小和观察到的质量上得到非常大的差异。你不妨把质量设置当作一个简单的"猜测",即应对特定图像施加多少压缩或视觉质量。本质上,要预先确定给定图像和质量设置的最终文件大小,实际上是不可能的……除非你真的去做。然而,IM 可以通过使用特殊的 'jpeg:extent' define 来做"试运行",以发现用于特定文件大小的最佳质量。参见上面的 JPEG 写入控制。它极慢,但比类似的 DIY 解决方案快。这样做不推荐,并不仅仅因为它慢。用你的固定文件大小方法,一张简单的图像可能会以 90% 的质量得出,却包含 50k 不必要的数据,而一张复杂的图像则不得不降到 30% 的质量,并因细节所需数据不足而表现出 JPEG 伪影(或者说得不那么技术化,它看起来会很糟)。更好的做法是找到一个单一的质量设置,使其对你相当数量的图像产生平均 100KB 的文件大小。即便如此,细节不多的图像可能只得出 50k。而细节繁复的图像可能得出 150k,两者看起来都可以接受。关于 JPEG 压缩和质量的实用指南,参见 Optimization of JPEG compression settings。另请参见 JPEG Compression, Quality and File Size,了解 JPEG 内部细节。Photoshop 提示:Photoshop 会向 JPEG 图像添加约 4 KB 的额外信息,用以保存预览和色彩管理信息(配置文件 '8BIM')。如果你不想要那些信息,请使用 'Save for Web'(存储为 Web 所用格式)功能。此提示见于 Gernot Hoffmann 关于 JPEG 压缩的一篇论文。

相关的 JPEG 输出格式

PJEG:写入一张渐进式加载的 JPEG 图像。
在如今网络下载快速的时代,这并不常用,但在拨号调制解调器是常态的年代非常常见。基本上是先写入每隔 N 行的内容,然后是它们之间的一行,依此类推,这样即使只下载了完整图像的一小部分,你也能看到图像。
JPEG2000:带有新增功能的最新 JPEG 格式。
这种格式需要安装 'JasPer jp2' 库,否则你会得到一个错误……

"no encode delegate for this image format"

这种格式使用小波压缩来压缩图像,而不是标准的 JPEG DCT 方法。这让你在相同图像质量下获得好得多的压缩比。从而进一步减少磁盘空间。不幸的是,它尚未被广泛采用,所以你不能将它用于外部目的,至少在 Web 浏览器以及其他图像查看器和编辑器也开始使用该格式之前不能。任何用此格式保存的图像只有拥有此库的用户才能读取,而且可能还要很长时间才会有相当比例的用户使用此库。尤其是 Windows 用户,因为除非有足够多的人提出需求,否则 Microsoft 可能不会将其包含进去。Quicktime 提示:Quicktime 使用 jp2 格式,但它必须以 "[-depth](https://imagemagick.org/command-line-options/#depth) 8" 输出。

非 ImageMagick 的 JPEG 处理(快速总结)

jpegtran 随 JPEG 库一起安装的标准工具。它允许你对 JPEG 格式图像应用各种变换,而无需解码和重新编码图像数据,从而避免 JPEG 数据劣化。(见下文)
jpegtrans 前述 "jpegtran" 程序的较新版本,不过其中许多新增特性(例如无损裁切)现已内置到分发的库版本中(见上文)。
jhead 一个更易用的无损 JPEG 处理器,尤其在 EXIF 数码相机配置文件方面。即注释处理、日期调整、缩略图提取、删除或替换、配置文件剥离等。它还尝试确保其他配置文件不被破坏,这是 "jpegtran" 往往会做的事。还有其他类似程序,例如 "[ExifTool](http://www.sno.phy.queensu.ca/~phil/exiftool/)" 和 "[Exifer](http://www.exifer.friedemann.info/)"。许多 JPEG 转网页相册程序也会这样做。
_无损 JPEG 旋转(上述所有程序都提供)只对尺寸能被 8 或 16 整除的图像才能正确工作。对大多数(但不是全部)数码相机照片而言是这样的。如果你对一张尺寸为奇数的图像尝试此操作,右侧或底部边缘的块(包含部分尺寸的那些)将无法在最终图像中正确定位,因为这些块只能存在于右侧或底部边缘。

关于此问题的示例,参见这个 具体讨论_
---|---
如你所见,大多数这些程序都是为处理 JPEG 图像元数据而设计的,无需重新处理 JPEG 压缩后的图像。(见下文)

无损 JPEG 处理

由于解码并重新编码一张 JPEG 图像会导致图像质量劣化(除非使用无损压缩),JPEG 图像库提供了一些特殊程序,能够在不损失质量的情况下操纵图像。这些命令通常也会比 IM 的等效操作快很多,因为它们不必对图像做那么多处理。在修改 JPEG 图像中的注释时,你可以使用较低层的 JPEG 库程序 "rdjpgcom"、"wrjpgcom" 和 "jpegtran"。不过我建议你使用 "[jhead](http://www.sentex.net/~mwandel/jhead/)" 程序,因为它会保留图像中同时存在的任何配置文件或其他信息。"jpegtran" 让你能更进一步,实际无损地操纵图像数据,包括 90 度旋转、裁切和插入。它甚至允许创建混合质量的 JPEG 图像。有关此功能的演示,参见 Nemo Thorx 的 JPEGhack 页面。(参见下面的说明)然而,这些命令 推荐用于一般用途,因为它们受限于 JPEG 图像的块边界(8 位或 16 位)。也就是说,你只能在 JPEG 压缩单元级别上进行裁切、旋转或插入,而不能在实际的像素级别上进行。注释……如果你正在为你的 JPEG 照片创建 拼贴缩略图 Web 索引页,并希望使用你用上述程序添加到 JPEG 文件的注释,请在 "magick montage" 命令行上读取文件名之前使用 "-label '%c'" 来告诉 montage 使用 'comment' 字段。你也可以在 复杂的拍立得变换拍立得拼贴 或某种图像 标注 中使用该注释。"[jhead](http://www.sentex.net/~mwandel/jhead/)" 程序可用于向 JPEG 图像文件添加或修改注释。然而,我发现使用 "edit comments"("-ce")选项不是个好办法,因为它会在注释末尾添加一个额外的换行符。这个额外的换行符会扰乱 IM 中命令('%c' 标签格式转义)的使用。更好的做法是使用 "comment input"("-ci")来输入一条注释(末尾不带换行符),或者 "comment literal"("-cl")选项会是更好的办法……

  jhead -cl 'Photo of some stuff, by Joe Citizen'  image_of_stuff.jpg

缩略图……Brian Jackson brian@brianjacksonphoto.com 也报告说,大多数数码相机(例如他的 Cannon 1D)会在它们生成的 JPEG 图像中某处嵌入一个大小在 12kb-25kb 之间(160x120 像素)的缩略图。IM 可以使用以下方式提取这些缩略图……

   magick image.jpg   thumbnail:thumb.jpg

然而,"[jhead](http://www.sentex.net/~mwandel/jhead/)" 程序也可以提取这些缩略图……

  mkdir thumbs
  jhead -st "thumbs/&i" *jpg

与 IM 相比,这极其快速,因为它不编辑图像,只是转移现有数据。然而,缩略图的质量远不及 IM 从真实图像生成的缩略图,它们也可能没有被正确旋转,而且它们肯定不会是你想要的尺寸。使用 ExifTool……来自 Rob,如果你想对存储在 JPEG 图像文件中的配置文件进行比 "[jhead](http://www.sentex.net/~mwandel/jhead/)" 所提供的更详细的编辑,可以看看基于 perl 的、更以 EXIF 为中心的应用 "[ExifTool](http://www.sno.phy.queensu.ca/~phil/exiftool/)",一个替代的编译版本 "[ExifTool](http://www.dalibor.cz/minolta/exiftool.htm)",以及一个 Windows GUI "[Exifer](http://www.exifer.friedemann.info/)",仅举几例。在安装了 Image::ExifTool Perl 模块后,下面这段代码会无损地剥离所有 JPEG 元数据。我发现以下方法与剥离 EXIF 数据的命令行方法等效。万一将来有人感兴趣:

  use Image::ExifTool;
  $exifTool = new  Image::ExifTool;
  $exifTool->SetNewValue('*');  # delete  all...
  $exifTool->WriteInfo('original_image.jpg','modified_image.jpg');
  $errorMessage = $exifTool->GetValue('Error');
  print  $errorMessage;  # (if has value an error occurred)

费了点功夫才弄明白,因为原来你需要先用 SetNewValue 赋值设置,然后用 WriteInfo 同时加载和保存。使用 JpegTrans 实现混合 JPEG 质量图像……Wolfgang Hugemann {Auto@Hugemann.de} 希望 JPEG 图像的边缘完全不被压缩,因为那会扰乱照片处理。参见 此站点。Yuval Levy 提供的解决方案是使用 "jpegtran" 将一张低质量的 JPG 插入到一张高质量的 JPEG 中……

解决方案: * 用 ImageMagick 生成同一张图像的两个版本,一个为高质量 100,另一个为低质量 60(用于减小尺寸)。 * 用 jpegtran 裁切 q60,每边削去 8 像素 * 用 jpegtran 将 q60 合并到 q100 之上 * 用 jpegtran 合并成一个条带

Nemo Thorx jpeghack@nemo.house.cx 读了上述内容并尝试实现混合 JPEG 质量。他成功了,并在他的 Wiki 页面 JPEGhack 上演示了结果。基本上,进行无损 JPEG 处理(例如"裁切"以及将新的 JPEG 块段"插入"到现有图像中)是完全可能的。


PNG 图像文件格式

这是最新、最现代的图像格式之一,支持 32 位颜色(包括 alpha 通道透明度),但也可以优化为类似 GIF 的 8 位索引色方案(256 色限制)。因此,它是一种出色的图像处理中间格式,不会损失图像信息。

PNG 压缩

与 PNG 输出一起使用时,质量被视为 两位十进制数字。第一位数字(十位)是 zlib 压缩级别,1-9。然而,如果使用 '0' 的设置,你将得到霍夫曼压缩而非 'zlib' 压缩,这往往更好!奇怪但是真的!第二位数字是 PNG 数据编码的过滤(在压缩之前)类型:0 为无,1 为 "sub",2 为 "up",3 为 "average",4 为 "Paeth",5 为 "adaptive"。所以对于具有连续纯色序列的图像,"none" 过滤(-quality 00)通常更好。对于自然风景图像,"adaptive" 过滤(-quality 05)一般更好。 | _PNG 编码器一直在进行大量工作,控制确切编码和压缩设置的更好方法通常使用 Define 运算符 来设置。

关于这些 define 的更多细节,参见下面的 写入 PNG 图像的控制选项,或查看 PNG 编码器文件 "coder/png.c 源代码中的注释。

_
---|---
如果你有一张带有二值(开/关)透明度的 ImageMagick 图像,PNG 编码器会以一种高效的方式写入它,使用 tRNS 块而不是完整的 alpha 通道。但如果存在 0 或 MaxRGB 以外的任何不透明度值,它会写入一个带 alpha 通道的 PNG。你可以通过使用 "-type TruecolorMatte" 图像读取设置来强制这种行为,或者你可以使用 "PNG32:" 格式文件来保存图像。一个外部程序 "[pngcrush](http://pmt.sourceforge.net/pngcrush/)" 或较新版本 "[OptiPNG](http://optipng.sourceforge.net/)" 会尝试将特定的 PNG 重新压缩到可用的最佳压缩,推荐用于你打算放到网站上的图像。另一个程序 "[pngnq](http://www.cybertherial.com/pngnq/pngnq.html)" 会将其颜色量化为 256 色、8 位的 PNG,不过尚不清楚它是否在该格式中支持半透明颜色。

更好的 PNG 压缩

关于 PNG 图像的一点是,PNG 图像会保留全透明像素的颜色。也就是说,即使你看不到,透明度也具有颜色,而 PNG 会保留该数据。这意味着在许多情况下,可以通过用一种静态纯色替换那种"不可见颜色"(而不是之前图像处理可能遗留下来的垃圾颜色)来让 PNG 压缩得更好。为此你可以使用两种主要方法,使用 Alpha Background 运算符 仅处理全透明像素,或使用 带透明度的模糊因子 类操作,将接近半透明的颜色也映射为全透明黑色。例如,这里我取我们上面生成的带模糊阴影的 "a.png" 图像,替换所有处于全透明 20% 范围内的像素。

  magick a.png  -fuzz 10% -transparent none  a_compress.png

[IM Output]

[IM Output] [IM Output]

如你所见,你在图像大小上得到了大幅改善(约 50%)。但图像阴影有一个锐利的截断。另一种替代方法是通过调整透明度通道的 色阶(Levels) 来让阴影效果变小。

  magick a.png  -channel A -level 20,100%,0.85 +channel \
          -background black -alpha background a_compress2.png

[IM Output]

[IM Output] [IM Output]

你还可以通过使用更少的颜色数量来改善压缩算法的结果,从而改善 PNG 图像的最终大小。

  magick image.jpg -thumbnail 200x90 -colors 256 \
          -quality 90 -depth 8  thumbnail.png

不过,这只推荐用于不涉及透明度的小缩略图,并且只作为最后一步,因为它是一种非常"有损"的技术。

PNG、Web 浏览器与透明度

Microsoft Internet Explorer(IE 版本 6 及更早)在涉及任何形式的透明度时无法正确显示 PNG。虽然这是最广为人知的不完全支持 PNG 的浏览器,但它并非唯一一个。PNG 透明度测试另一个 PNG 测试 页面会让你测试你的浏览器。它们还列出了产生所显示结果的浏览器及版本。然而,由于 IE(至少在撰写时)可能是最常见的浏览器,你可以在你的网页上添加一些针对该问题的变通办法。关于这方面的信息,请查看我的 WWW 实验室页面 PNG with Transparency and IE,在那里我测试并演示了我正在使用的 "PNG in IE" 解决方案。其他解决方案是把 PNG 魔法(magick)成 JPEG(带有正确颜色的背景)或 GIF 格式。这些方法在 背景上的 GIF 图像 中有详尽讨论。另一个解决方案是在将图像保存为 PNG 之前,设置图像中所有全透明颜色的颜色。PNG 会保存那种全透明颜色,但请注意,几乎任何其他 IM 操作都会把全透明重置回全透明黑色(因为透明色本不应该有影响,图像数学就是这样工作的)。 例如,标准 IM 示例测试图像 对任何全透明的像素都使用全透明黑色。我们可以通过关闭 alpha 通道,或将其保存为 JPEG 来验证这一点…… |

  magick test.png test.jpg

[IM Text]
现在让我们这样保存它,使所有全透明颜色都被替换为全透明 'silver' 颜色(参见 Alpha Background 运算符)…… |

  magick test.png   -background silver -alpha Background   test_silver.png

[IM Text]
请注意,如果透明度(或页面上的特殊 JAVA 脚本)在你的浏览器上工作,图像应该仍然看起来正确。但如果我们关闭 alpha 通道(通过保存为不允许 alpha 的 JPEG),我们可以看到 PNG 图像确实对全透明像素使用了 'silver' 颜色。 |

  magick test_silver.png test_silver.jpg

[IM Text]
不过请注意,这 不会 修改半透明像素,它们仍将具有其正常(非透明)的颜色,不会把该颜色与页面背景或用于全透明的颜色混合。由于不再涉及半透明,边框看起来可能呈锯齿状(混叠),在较浅色的边缘还会有"光晕"效果。例如,看看黑白圆圈的边缘,它们显示出"锯齿"混叠效果。然而,使用灰色替换颜色应该会让这不像最初用于全透明的"黑色"那么糟糕。设置全透明像素颜色的另一个好处是改善数据压缩。有时候,处理过程中透明区域底下的颜色被保留了下来。这些反过来不如纯色压缩得好。因此,像我们上面那样设置全透明颜色,可以在最终文件大小上带来不错的节省。然而这应当作为最后一步来做,因为许多 IM 图像处理操作会把图像中存在的任何全透明颜色替换回全透明黑色。已知会这样做的运算符列表,参见 Alpha Background 运算符。对于 PNG 显示问题,我的偏好是让 Microsoft 修复 IE,看来 IE 版本 7 终于将在所有情况下都有一个完全可用的 PNG 透明度处理。

PNG 与虚拟画布

虽然 PNG 通常 不会 保存虚拟画布尺寸信息,但它确实会保存虚拟画布偏移信息,如果存在的话,IM 会尝试生成一个适合该偏移和图像尺寸的"画布尺寸"。对于某些图像运算符(例如 "[-crop](https://imagemagick.org/command-line-options/#crop)"、"[-trim](https://imagemagick.org/command-line-options/#trim)" 和 "[-flatten](https://imagemagick.org/command-line-options/#flatten)" 等,它们把图像的画布或页面尺寸作为其操作或结果的一部分),记住这一点可能很重要。当然,你可以使用 "[-page](https://imagemagick.org/command-line-options/#page)" 设置和 "[-repage](https://imagemagick.org/command-line-options/#repage)" 运算符来设置或移除虚拟画布尺寸和偏移。(参见 页面图像属性)。例如,第二个 IM "magick" 看到这张 PNG 图像中存在的偏移,并定义了一个足够大的画布,以确保图像在虚拟画布边界内可见(IM v6.1.7 添加)…… |

  magick rose: -repage 0x0+40+30 png:- |\
      magick - -background LightBlue -flatten  png_offset_flattened.jpg

[IM Output]
然而,尽管 PNG 格式通常不会保存画布尺寸信息,IM 确实会向 PNG 图像添加一些虚拟画布尺寸元数据。不过这些数据只能被 IM 命令使用,通常会被其他 PNG 图像格式读取器忽略。例如,第二个 "magick" 命令确实看到了一些虚拟画布尺寸信息…… |

  magick rose: -repage 100x100+10+10 png:- |\
      magick - -background LightBlue -flatten  png_size_flattened.jpg

[IM Output]
如果该 PNG 被某个非 IM 程序处理,这个画布尺寸元数据可能会丢失。请记住,画布尺寸信息通常不是 PNG 图像文件格式的一部分。另一件要注意的事是,'偏移'信息可以有负偏移(不像 GIF 格式),IM 会适当地处理这些,这使该格式很适合存储中间的 图层图像。 | 某些 Web 浏览器不太能处理负偏移,会产生奇怪的结果(某个版本的 firefox 有此问题)。对于可能被 Web 浏览器等其他程序使用的图像,最好避免负偏移。
---|---

PNG 分辨率、密度与单位

经过一些测试,看来 PNG 图像文件格式不支持 'PixelsPerInch' 的 "[-units](https://imagemagick.org/command-line-options/#units)" 设置,只支持 'undefined' 和 'PixelsPerCentimeter'。因此,IM 会将给定的密度/单位设置转换为 'PixelsPerCentimeter' 的相应值。关于这个主题,更多内容待续

PNG 子格式

PNG: 默认。使用经济的格式保存图像。
PNG8: 等同于 GIF 的 PNG,包括布尔透明度和 256 色的颜色表。
PNG24: 不带 alpha 通道的 8 位 RGB 通道。特殊情况下可以包含布尔透明度(见下文)
PNG32: 强制使用具有完整半透明度的完整 RGBA 图像格式。
PNG48: 不带 alpha 通道的 16 位 RGB 通道
PNG64: 16 位 RGBA 图像(包括半透明度)
PNG00: 从输入图像继承 PNG 颜色和位深。
更多信息参见 图像类型 I/O 设置 PNG8 是由 PhotoShop 定义的,而非 PNG 工作组。虽然它可以处理多种半透明颜色以及一种全透明颜色,但 IM 假设它不能。这提供了一种方法,强制图像正确工作,并默认能被 Internet Explorer v6 读取。"Photoshop CS" 程序可以读取它。
--- ---
PNG48、PNG64 和 PNG00 样式是在 IM v6.8.2-0 时添加的
--- ---
你可以强制 IM 创建一个图像颜色索引表(或调色板),然后 IM 会使用 "PNG8:" 格式保存该图像……
  magick {input_image}  -type Palette  indexed.png

要强制使用单个 8 位灰度通道、但不是调色板索引图像,请使用……

  magick {input_image}  -type GrayScale -depth 8  gray.png

你还可以(IM v6.3.5-9 添加)输出带透明度通道的灰度图像。

  magick {input_image}  -type GrayscaleMatte  gray_with_transparency.png

对于简单的双色图像……

  magick {input_image}  -type BiLevel  bitmap.png

PNG24 图像存在一种特殊情况。如果图像只包含布尔透明度,且所有透明颜色都相同,并且该颜色仅用于透明,那么 PNG 编码器会将该特定颜色指定为透明。例如…… |

  magick a.png -channel A -threshold 75% +channel \
          -background hotpink  -alpha background png24:a_png24_alpha.png

[IM Output]
这张图像没有调色板,但确实有一些开/关式的 alpha。alpha 通道的 -threshold 确保只存在布尔(开/关)透明度,而 Alpha Background 选项确保所有全透明像素都是一种特定颜色。上述操作 不能 确保没有具有该颜色的不透明像素,所以上述操作仍可能失败。

写入 PNG 图像的控制选项

为了更好地控制 PNG 图像的写入,Glenn Randers-Pehrson 在 IM v6.5.2 修订了一些编码器 "[Define 全局设置](basics.html#define)" 控制。其中包括……

-quality '{level}{filter}'
保存 PNG 图像时的基本压缩级别和过滤器。

-define png:compression-strategy=zs
-define png:compression-level=zl
-define png:compression-filter=fm

 完全定义要用于所写入 PNG 图像的压缩系统。[-quality](https://imagemagick.org/command-line-options/#quality) 设置通常会设定 _zl_ 和 _fm_ 值,但不会设定 _zs_ 设置。
-depth
要生成的图像的一般位深,通常设为 8 位或 16 位。
-define png:bit-depth={depth}
精确指定所得 PNG 图像文件格式的位深。这会覆盖常规的 IM "[-depth](https://imagemagick.org/command-line-options/#depth)" 控制,但仅用于写入 PNG 图像,并且仅当该更改可以在无损的情况下进行时。对于颜色映射图像,这是颜色映射索引的位深,而不是颜色样本的位深。
-define png:color-type={type}
精确指定所写入 PNG 文件的类型。值可以是 '0' | 表示灰度,允许 'bit-depths' 为 2、3、4、8 或 16。

---|---
'2' | 表示 RGB,允许 'bit-depths' 为 8 或 16。
'3' | 表示索引(Indexed),允许 'bit-depths' 为 1、2、4 或 8。
'4' | 表示 Gray-Matte(灰度+遮罩)
'6' | 表示 RGB-Matte(RGB+遮罩)
请注意,"-define png:color-type='2'" 特别适用于强制将图像数据存储为 RGB 值而非 sRGB 值。不过,使用 "-set colorspace sRGB" 对一张线性 RGB 图像也能取得类似的效果。然而,不要指望程序在读取时会尊重这种线性色彩空间。这包括 ImageMagick。

-profile PNG-chunk-{x}:{file}

从 {file} 在位置 {x} 添加一个原始 PNG 配置文件。{file} 的前 4 个字节包含块名称,后跟一个冒号 ':' 字符,然后是块数据。{x} 可以是 'b' 以将配置文件放在 PLTE 之前,'m' 放在 PLTE 与 IDAT 之间,或 'e' 放在 IDAT 之后。如果你想写入多个相同类型的块,那么在 {x} 后添加一个简短的唯一字符串,以防止后续的配置文件覆盖前面的。例如……

-profile PNG-chunk-b01:file01 -profile PNG-chunk-b02:file02


+set date:create
+set date:modify

 这些是 ImageMagick 在每次读取文件时创建的图像'属性'。它们分别包含图像文件的创建时间(实际上是权限/所有者/移动的更改时间)和最后文件修改时间。不幸的是,PNG 图像文件格式喜欢把这类图像数据连同 PNG 图像文件格式一起写入,如果这些数据不同,那么即使其他什么都没变,生成的文件也会不同。


 magick logo: logo.jpg magick logo.jpg
    logo1.png

  sleep 2; touch logo.jpg      # change the JPG file timestamp
  magick logo.jpg logo2.png

  diff -s logo1.png logo2.png
  magick compare -metric RMSE logo1.png logo2.png null:

上面的 "diff' 会返回消息

"Binary files logo1.png and logo2.png differ"

尽管 "magick compare" 返回 "0 (0)",表示这两张图像具有完全相同的图像数据。请注意,由于 IM 用它刚读取的 PNG 文件的时间覆盖了这些属性,你无法使用 "magick identify" 看到记录在 PNG 中的这些属性的实际值。解决办法是保存不带任何'时间戳'的 PNG 图像。

  magick logo: logo.jpg
  magick logo.jpg +set date:create +set date:modify logo1.png

  sleep 2; touch logo.jpg
  magick logo.jpg +set date:create +set date:modify logo2.png

  diff -s logo1.png logo2.png

这次 "diff" 报告……

"Files logo1.png and logo2.png are identical"

旁注:你还可以使用其他 UNIX 程序,例如 "cmp"、"md5sum" 或 "sha1sum" 来比较二进制图像文件。后两个程序不能保证万无一失,但实际上几乎不可能被骗,且在比较两个以上文件时更快(使用校验和)。多亏了 PNG 开发者 GlennRP 的一些补充,你现在还可以使用 "-define png:exclude-chunk=date" 来告诉 PNG 编码器不要写入与日期相关的文本块。

非 ImageMagick 的 PNG 处理

有相当多用于 PNG 的辅助应用程序,它们可能是生成最终 PNG 图像文件的有用辅助工具。 pngtrans 随图像一起存储的 PNG 信息
pngcrush 通过尝试用所有合乎逻辑的可用 PNG 压缩来压缩图像,从而尝试为每张单独的图像找到 PNG 的最佳压缩,再做出最终选择。这当然会在每张图像上花费一些时间。
OptiPNG 一个较新的 PNG 压缩优化器。
pngquant 有损 PNG 优化器,通过抖动将 PNG 图像缩减为 8 位颜色调色板。它会构建带 alpha 透明色(透明色信息通过 tRNS 块传递)的索引色 PNG。
pngnq 一个较新的有损 PNG 量化器,用于生成 8 位颜色表的 PNG 图像。也会强制使用颜色调色板。
pngout 一个 Windows 平台的 PNG 优化器(带可选 GUI),它使用为节省空间而非速度而优化的 ZIP 压缩器(也在上面链接的页面上)。
这些大多是为了改善图像文件的最终大小,使用有损或非有损技术。

图像配置文件(Profiles)

处理照片级质量图像的配置文件很重要,然而据我所知,这是一门非常玄学的技艺,绝非简单的事情。并非所有格式都使用配置文件,但大多数现代格式都使用。这包括 JPEG、PNG、TIFF,以及(自 IM v6.3.4-1 起)GIF。事实上,由于许多程序甚至不理解或不会去查找图像中的颜色配置文件,这个问题变得更加严重。Alan Gibson, aka Snibgo 在他自己的 Snibgo, ImageMagick Profiles 页面上汇总了各种 Web 浏览器如何处理各种颜色配置文件的总结。这值得一看。要列出一张图像中存在哪些配置文件,请使用……

  magick identify -verbose image.tif | grep 'Profile-.*bytes'

常见的配置文件(及我所掌握的相关信息的指引)包括……

 EXIF |  [数码相机元数据](photos.html#exif)

---|---
ICC | 图像色彩空间配置文件
ICM | Microsoft 色彩管理(类似 ICC)
IPTC | 图像与作者信息
8BIM | Photoshop 元数据配置文件。包括关于以下内容的数据:剪贴路径(Clip Paths)…… 还有什么?
XMP | Adobe 的可扩展元数据平台(Extensible Metadata Platform,XMP)(参见 adobe 页面
你可以使用 IM 为此目的提供的一些特殊输出格式来提取这些常见配置文件。例如……

  magick -define jpeg:size=64x64  image.jpg  iptc:profile.iptc
  magick -define jpeg:size=64x64  image.jpg  xmp:profile.xmp

上面的 "[-define](https://imagemagick.org/command-line-options/#define)" 选项被用作给 JPEG 库的一个'提示',以减少它实际读入内存的图像数据量,从而省去对你实际上并不打算使用的数据进行大量处理。你还可以将任意配置文件作为一个'blob'或包含你喜欢的任何信息的二进制字符串插入或重新插入。

  -profile '_profile_name_ :_data_file_ '

也就是说,文件 "data_file" 被'原样'添加到图像中,作为配置文件 profile_name。IM 或任何其他应用程序都会忽略此类配置文件,除非它特别知道该配置文件。

颜色配置文件基础

首先简短说一句……

色彩管理是给软蛋的 -- 别折腾它们
摆弄配置文件通常只会让事情更糟

所以,如果颜色看起来不错……就别去碰它。IM 论坛中一位用户 fhoech(此后已经销声匿迹)曾多次发表以下关于使用颜色配置文件来更改图像所用色彩空间的基础介绍……RGB、sRGB 和 CMYK 不是色彩空间,它们是色彩系统(IM 使用 "[-colorspace](https://imagemagick.org/command-line-options/#colorspace)" 运算符来控制它们)。不存在单一的 RGB 或 CMYK 色彩空间,而是在每种色彩系统中字面上可能有无穷多种不同的色彩空间。你需要能够准确表征你图像中颜色的 ICC(或 ICM)配置文件。通常,描述一张图像的 ICC 配置文件应当嵌入到图像本身中,否则你就不得不使用一种只是变通办法的'最佳猜测'尝试:在一个支持 ICC 的图像编辑器中打开图像,并分配不同的 ICC 配置文件(不要转换!),直到你找到一个让你的图像看起来还行的(你的显示器必须经过校准,这样你才能真正得到颜色的良好预览)。然后,保存嵌入了该配置文件的图像。至于你为什么需要两个配置文件:源配置文件描述你图像中现在的颜色。目标配置文件描述转换后输出图像中的颜色。此外,在转换到某个给定的目标配置文件时你应当格外小心:例如,如果你使用一个描述未涂布纸张上胶印的配置文件,却打算把图像用于涂布纸张上的印刷,你当然不会得到任何好结果。输出配置文件需要是你预期输出条件的准确表示。当在不使用正确配置文件(转换的两个步骤都需要)的情况下,从减色色彩空间转换到加色色彩空间(或反之)时,你在大多数情况下都得不到'正确'的颜色或亮度,尽管你可能走运'碰巧'命中目标。你可以从 International Color Consortium 下载颜色配置文件。

通过配置文件更改色彩空间

虽然你可以像这样简单地直接魔法(magick)色彩空间……

  magick _cmyk_image.jpg_ -colorspace rgb _rgb_image.jpg_

将 CMYK 转换为 RGB JPEG 的最佳解决方案是使用配置文件配合 "[-profile](https://imagemagick.org/command-line-options/#profile)" 运算符。Raf Lenaerts 指出了在 ImageMagick 中使用 "[-profile](https://imagemagick.org/command-line-options/#profile)" 运算符的以下规则……

如果没有嵌入的配置文件,那么第一个 "`[-profile](https://imagemagick.org/command-line-options/#profile)`" 是输入配置文件。第二个 "`[-profile](https://imagemagick.org/command-line-options/#profile)`" 则定义输出配置文件。
如果有嵌入的配置文件,那么单个 "`[-profile](https://imagemagick.org/command-line-options/#profile)`" 运算符会立即定义输出配置文件。

总结……

  • "[-profile](https://imagemagick.org/command-line-options/#profile)" 必须放在输入和输出文件之间。
    这实际上是标准的 IM 命令行处理惯例
  • 使用 "[+profile](https://imagemagick.org/command-line-options/#profile)" 配合 'icm' 来移除存在的任何 icc-profile。
  • 然后给出的第一个 "[-profile](https://imagemagick.org/command-line-options/#profile)" 是输入配置文件。
  • 给出的第二个 "[-profile](https://imagemagick.org/command-line-options/#profile)" 是输出配置文件。

因此,要对所有图像使用配置文件,你将需要三个 "[-profile](https://imagemagick.org/command-line-options/#profile)" 操作:移除、输入和输出配置文件选项。例如,如果输入图像已经有一个颜色配置文件,那么只需要一个。

  magick _rgb_image.jpg_ -profile USCoat.icm _cmyk_image.jpg_

但如果图像没有(或你知道它是一张没有现有配置文件的 RGB 图像),你可以使用……

    magick _rgb_image.jpg_ +profile icm \
            -profile sRGB.icc  -profile USCoat.icm _cmyk_image.jpg_

这将所得图像设置为 CMYK USCoat.icm 配置文件。另一个 CMYK 配置文件是 SWOP.icm 配置文件。对于反向操作(图像已有配置文件),使用……

    magick _cmyk_image.jpg_ -profile sRGB.icc _rgb_image.jpg_

警告: 如果原始图像已经包含一个配置文件(例如 CMYK 配置文件),那么给出两次配置文件转换是个坏主意。例如

    magick _cmyk_image.jpg_ -profile "CMYK.icc" -profile "RGB.icc" \
                  _output_image.jpg_

将导致 CMYK -> CMYK -> RGB 的转换。但由于 CMYK 不是对称的,这个额外的转换步骤可能导致灾难性的颜色转换。(参见 IM 论坛讨论 Question on ICC profile conversion behaviour

颜色配置文件修改

你想要魔法(magick)的图像应当全都嵌入了 ICC 配置文件。因此,要用相同的某个 CMYK ICC 配置文件来魔法(magick)你的图像……

  magick _rgb_image.jpg_ -profile CMYK_PROFILE _cmyk_image.jpg_

这将使用感知意图(perceptive intent,默认值)来魔法(magick)(关于渲染意图的详细解释,参见 色彩空间转换)。由于经由感知意图得到的结果会因创建 ICC 配置文件所用的软件而有很大不同,你可以使用 "[-black-point-compensation](https://imagemagick.org/command-line-options/#black-point-compensation)" 配合 "[-intent](https://imagemagick.org/command-line-options/#intent) relative" 来得到一个稍微更接近人们可能预期的结果。

  magick _rgb_image.jpg_  -intent relative -black-point-compensation \
          -profile CMYK_PROFILE     _cmyk_image.jpg_

| "[-black-point-compensation](https://imagemagick.org/command-line-options/#black-point-compensation)" 和 "[-intent](https://imagemagick.org/command-line-options/#intent)" 设置都需要在 "[-profile](https://imagemagick.org/command-line-options/#profile)" 操作之前指定,才能生效。
---|---
| "[-black-point-compensation](https://imagemagick.org/command-line-options/#black-point-compensation)" 选项在 IM v6.2.7-0 添加。
---|---
你可以从 International Color Consortium 下载颜色配置文件。

EXIF InterColorProfile

在上述颜色配置文件处理之上,许多数码相机会在 EXIF 配置文件属性 'InterColorProfile' 中保存颜色配置文件信息。根据文档 "Colour Management and Adobe PhotoShop 7",此属性意在"在没有嵌入颜色配置文件的情况下被假定使用"。

IPTC 配置文件

IPTC 配置文件用于在图像中存储图像的标识属性,例如标题、署名、作者、关键词等。如果你想向图像添加 IPTC 配置文件,你需要单个 -profile:

  magick _image.jpg_ -profile iptc _iptc_image.jpg_

如果一张图像包含一个配置文件,你可以用这个把它保存下来,这样你就能把该配置文件添加到其他类似的图像上:

  magick _iptc_image.jpg_ iptcData.iptc

或者你可以提取出配置文件的文本版本以便编辑

    magick _iptc_image.jpg_ IPTCTEXT:iptcData.pro

例如,这里是由 fcaserioIM 论坛 中贡献的一个配置文件。

[IM Text]

你可以使用以下方式将此配置文件添加到图像

  magick _image.jpg_ +profile 8BIM -profile 8BIMTEXT:iptcData.pro \
          iptc_image.jpg

该图像可以被转换成带 TIFF 预览的 EPS(封装 Postscript)(EPT),其中也包含 IPTC 配置文件。(感谢 Tee Tanne)。

  magick _itpc_image.jpg_  EPT:image.eps

XMP 配置文件

从 TIF 图像提取 XMP 配置文件……

  magick picture.tif metadata.xmp


关于矢量图像格式

世界上图像存储不止一种样式…… 栅格(Raster) 使用彩色像素阵列来存储和处理的图像。栅格图像格式包括 GIF、PNG、JPEG、TIFF 等。图像可以由代表不同颜色的多个阵列(通道)组成,并且在一个图像文件格式文件中可以有多张图像、图层或帧(取决于用法)。
矢量(Vector) 图像用线条、粗细、平铺、渐变以及更大的复合对象来定义。格式包括 SVG、Postscript、PDF、FIG、DXF、WMF,甚至 TTF 字体。它允许图像被调整大小,甚至大幅放大 而不损失质量。此外,在编辑此类格式时,你通常可以四处移动整个对象而不破坏它下面的东西(对象分层)。
分形(Fractal) 图像是一种特殊的罕见情形,用于实现复杂图像(例如古老画作)的极致压缩。然而,我所知道的唯一用途是在一款非常昂贵的商业产品中。在该用途之外,它还被用于复杂的数学对象,例如 Mandelbrot 集和 Julia 集,以及在屏幕保护程序中生成随机的色彩飞溅(IFS)。它非常罕见。
为什么这很重要?因为 IM 是一个'栅格图像处理器',虽然它可以读取或写入以某种矢量格式存储的图像,但它是通过将图像转换为内部栅格图像、再从内部栅格图像转换回来的方式做到的。因此,如果你试图把一张图像从一种矢量格式魔法(magick)成另一种矢量格式,IM 本质上会以当前定义的 分辨率或密度 将该图像栅格化,但愿(但不太可能)这适合你打算用它的输出设备。换句话说,IM 的任何输出都永远不会是真正的矢量格式。虽然它可以把它的内部栅格格式魔法(magick)成一个矢量格式文件,但结果只是围绕一张栅格格式图像的肤浅的矢量图像外壳。除非该栅格图像针对输出设备被正确定义(以正确的分辨率),否则结果不会特别好。不幸的是,IM 的新用户对此一无所知。他们把 IM 看作一个可以把 PDF 魔法(magick)成 Postscript 的转换器,生成带有"块状"混叠效果、颜色"褪色"或模糊的图像,在预期的输出设备上根本看起来不好。这就引出了我想说的……

避免使用 ImageMagick 进行'矢量图像'到'矢量图像'的转换
例如:在 PDF、PS、SVG 等格式之间转换

换句话说,用对的工具做对的事。而对于这种情况,ImageMagick 不是对的工具。

这并不是说 IM 不能用来做这样的转换。毕竟,大多数打印机和显示器实际上是自己将图像栅格化,以便实际打印到一张纸上。区别在于打印机知道它所用硬件需要什么分辨率。ImageMagick 不知道。关于将矢量图像转换为栅格(以及改善此类转换)的示例,参见示例 Postscript/PDF 预格式化文本与图形输入,对于 SVG 和用户生成的矢量图像,参见 SVG 图像处理。你可能还会发现关于 字体大小、分辨率与磅值 的信息有用,特别是关于 "[-density](https://imagemagick.org/command-line-options/#density)" 对绘制文本字体的影响。

非 IM 的替代方案

如果你确实需要在矢量格式之间做一般性转换,可以使用程序 UniConvertor, Sk1 Project(通常作为标准 linux 软件包提供)和 VectorSection 来魔法(magick)矢量到矢量,而无需实际栅格化图像。对于将 Postscript 一般性转换为其他矢量格式,请看 "[pstoedit](http://www.pstoedit.net/pstoedit)",它通常可在你系统的额外软件包仓库中获得。另请看 "[epstopdf](http://www.ctan.org/tex-archive/support/epstopdf/)",它是 Comprehensive TeX Network (CTAN) 的一部分。TeX 和 LaTeX 是 UNIX 文档(书籍和科学文章)文本处理系统。它有许多与 Postscript 和 PDF 格式相关的工具。对于 SVG 到 PDF 的转换,Wolfgang Hugemann Auto@hugemann.de 建议,最简单的矢量到矢量转换是在浏览器(Firefox)中显示 SVG,然后用一个 PDF 打印机驱动打印它。不过 "Uniconvertor" 也可以使用。


其他图像文件格式

当然,还有大量其他图像文件格式是 IM 可以使用和理解的,然而使用这许多不那么'常见'的格式是为某个特定目的专门设计的,并且常常需要一些调整或其他选项才能让它们按你想要的方式运行。我不推荐这些文件格式,一般来说我自己也不使用它们。不过我确实尝试记录在 IM 邮件列表或 IM 论坛 上报告过的各种笔记、技巧和选项,以便其他人也能使用收集到的信息。许多笔记是原始、未经处理的形式,我愿意接受进一步的贡献,或对下面的笔记进行重写。


Postscript (PS, EPS) 与 Adobe PDF

基本处理参见 Postscript 文本处理 以及关于 矢量图像格式 的警告。Postscript 及其相关格式(如 PDF)的主要问题在于,它是一种复杂的页面排版语言。也就是说,该格式是一个程序,而并不真的是一种图像格式!这意味着 IM 不得不依赖另一个外部程序(或委托/delegate)来'运行'该程序并返回生成的图像。

封装 Postscript (EPS)

封装 Postscript 实际上与普通 postscript(一种矢量图像格式)完全相同,只是它是单页图像,并且存在一个 "Bounding Box"(边界框)条目来定义图像所覆盖的确切区域。该格式被设计用来允许其他程序在将其定义的 postscript 插入到其他 postscript 文档中时移动和缩放图像。IM 处理它的方式与处理 postscript 基本相同。(见上文)。

  magick image.jpg -compress none eps2:image.eps

使用 "EPS2:" 或 "EPS3:" 来创建 JPEG 压缩的 EPS 文件:注意:向 EPS 图像添加配置文件在'待办'列表上,但目前不受支持。

Postscript/PDF 输入

由于这种格式是矢量图像格式,它会受到诸如 "[-page](https://imagemagick.org/command-line-options/#page)" 和 "[-density](https://imagemagick.org/command-line-options/#density)" 等设置的影响。读取 Postscript(EPS 和 PDF 格式与之相同)的示例在 Postscript 格式化文本 中提供,你应该先阅读这个。然而,这些格式的读取非常复杂,因为它们是完整的计算机语言,专门设计用于在高质量激光打印机上生成打印页面。这远远超出了 ImageMagick 的范畴,所以它依赖一个被称为 "ghostscript" 的专门委托程序来读取 Postscript 和 PDF 页面并将其转换为栅格图像。一点说明。 由于 IM 使用 Ghostscript 以特定分辨率栅格化一个 postscript 文件,除非已知该栅格图像的确切密度,否则 postscript 文件中的任何栅格图像往往会模糊或失真。这还假设 postscript 程序本身不会旋转或以其他方式操纵该栅格图像。事实上,存在多个委托程序,IM 会根据情况选择。例如,'ps:color'(使用 'bmpsep8' ghostscript 设备)与 'ps:alpha'(使用 'pngalpha')的选择,取决于是否设置了 "-channel RGBA"。默认使用 'ps:color' 委托而不是 'ps:alpha',因为 'pngalpha' ghostscript 设备只支持单页/单图,而 PDF 通常是多页的。在读取图像之前使用 "-channel RGBA" 以选择 'pngalpha' 委托方法。如果你只想要页数,使用 ghostscript 会快得多。

  gs -q -sPDFname=document.pdf   pdfpagecount.ps
  %%Pages: 96

Windows 与 Ghostscript 稍微复杂一些,因为它需要使用 Windows 注册表。

特殊的 ImageMagick PDF 读取选项

PDF 处理的特殊选项……

-units PixelsPerInch
在处理(读取或创建)PDF 文档时应当设置。我不确定它的具体作用,但有报告表明应当设置它才能正常工作。
-define pdf:use-cropbox=true
按照 Adobe 生成的 PDF 文件,使用 'cropbox' 而不是默认的 'mediabox'。(基本上是在从 PDF 图像进行的 ghostscript 转换中添加一个 "-dUseCropBox"。注意:如果你的 PDF 只有一页,这有效,但如果它是多页 PDF,它将无法正确裁切。
-define pdf:use-trimbox=true
按照 Adobe 生成的 PDF 文件,使用 'trimbox' 而不是默认的 'mediabox'。

修改输入委托

修改系统委托是危险的,一个错误可能导致 IM 无法读取 postscript/PDF 文件。你可能还需要管理员权限,因为由于安全('黑客')措施,你无法用个人委托替换系统定义的委托。关于委托 XML 语法和含义,以及创建个人输入/输出委托的更多信息,参见 图像格式的委托与编码器。在论坛主题 Convert EPS to JPG Unreliable 上,有人建议你编辑你的系统 "delegates.xml",并将 "-sDEVICE=bmpsep8" 替换为 "-sDEVICE=bmp16"。其他用户发现把它改为 "-sDEVICE=pnmraw" 也效果更好。我自己没有试过这个,所以无法对此提供任何保证,也不知道它适用于哪些版本的 Ghostscript。如果你有任何进一步的信息,请告诉我。如果你有一个 CMYK 的 postscript 或 PDF 文件,那么 Blog of John 页面详细说明了你如何修改委托条目(添加一个 "-dUseCIEColor" ghostscript 选项),使 ghostscript convert 处理这种 postscript。另一种可能性是创建一个会调用 pdftoppm 的个人 "委托"。比如说这个标签叫 "pdfalt",它调用程序 "pdftoppm",甚至是来自 "xpdf" 软件包的 "pdfimage"。那么你的流就会看起来像这样:

  magick pdfalt:image.pdf image.png

有人愿意试试创建委托吗?请告诉我们! 你也可以尝试使用 "pstoedit",它可以将一个 postscript 文件转换为其他矢量格式,或将 postscript 传入 ImageMagick API,把它魔法(magick)成位图。我没有试验或测试过这个,希望得到一些反馈。

PDF 栅格图像提取

将任何 PDF 页面渲染到特定尺寸或'密度'是 PDF 所用矢量图形的核心。它对文本或线条图效果极好。但这也意味着 PDF 中的任何栅格图像(像素阵列)都必须被调整大小。但调整大小是一个'有损'操作,会导致一些图像劣化,除非你使用该栅格图像的原始密度,而这在 PDF 中可能因图像而异!因此,能够在不带任何'密度'参考的情况下从 PDF 中提取栅格图像是有利的。你可以使用 "pdfimages" 程序直接提取栅格图像,它是 poppler-utils 或 "xpdf-utils 软件包的一部分。这些软件包还包含许多你会发现对 PDF 处理有用的其他工具。参见 Poppler for WindowsXpdf Reader。你可能还想看看来自维护 GhostScript 的同一批人推出的 "MuPDF" 软件包中的 "mutool"。一个用于提取文本和图像的在线工具是 Sumnotes(商业产品,有限的免费试用)。在更低的层面上,Wolfgang Hugemann 说你可以提取 PDF 包含的任何图像(尤其是来自扫描仪生成的 PDF)。基本上是通过提取 "stream" 和 "endstream" 之间的任何字节序列,并保存为单独的文件。

PDF 文本提取

你可以使用 GhostScript 程序 "ps2ascii" 或 "pstotext"。或者作为一个同时处理文本和图像的替代方案,看看 "pdftohtml",它有一个 XML 输出,Ross Presser 报告说"在重组段落方面相当不错"。此外,"pdftk" 程序可以'解压缩'一个 PDF,以便直接编辑,以及'修复'损坏的 PDF。

Postscript/PDF 输出选项

已知以下设置会影响 Postscript、封装 Postscript 和 PDF 图像格式的输出:"[-page](https://imagemagick.org/command-line-options/#page)"、"[-gravity](https://imagemagick.org/command-line-options/#gravity)"、"[-compress](https://imagemagick.org/command-line-options/#compress)"、"[-density](https://imagemagick.org/command-line-options/#density)"。默认情况下,PDF 图像输出不使用压缩,所以 PDF 文件往往会比必要的大很多。下表把 IM 压缩模式与所使用的相应 Postscript 压缩模式对应起来。

PS/PDF 压缩含义 压缩 图像 '/Filter [ ... ]' 设置
"-compress none" '/ASCII85Decode'
"-compress zip" '/FlateDecode'
"-compress jpeg" '/DCTDecode'
"-compress lzw" '/LZWDecode'
"-alpha off -monochrome -compress fax" '/CCITTFaxDecode'
"+compress"
"-compress rle"
其他任何 '/RunLengthDecode'

PDF 推荐的压缩是 Zip(Deflate 压缩)或 Group4(Fax)压缩。

  magick image.gif -alpha off -monochrome -compress Zip -quality 100 \
          -units PixelsPerInch -density 600  image_deflate.pdf

  magick image.gif -alpha off -monochrome -compress Group4 -quality 100 \
          -units PixelsPerInch -density 600  image_group4.pdf

对于一张黑白页面,这两个命令产生的 PDF 文件比直接转换小得多。然而,哪个更小取决于图像,不试着测试所得大小就无法确定。

Postscript/PDF 输出替代方案

请记住,PDF 是一种矢量图像(文档)格式,而 IM 是一个栅格图像处理器。这意味着 IM 创建的任何 PDF 文档基本上将由每页一张栅格图像构成。PDF 文档中输出的图像将被固定在特定分辨率(或像素密度)上,当在某个其他分辨率下查看或打印时,这会导致像素失真问题。此外,对于文本文档,使用栅格图像是浪费的,因为带有字体和排版元数据的纯文本总会比文本的扫描栅格图像小得多,渲染也更好。因此,其他 PDF 创建程序可能更适合你的需求。这会让你保持图像为图像、文本为文本,让你以更美观、更合乎逻辑的方式把文本和图像放在一起,以及以更合乎逻辑的方式插入文本、叠加箭头或连接线。例如,我建议你看看 TeX 和 LaTeX 系统提供的支持程序。参见 Comprehensive TeX Network (CTAN)。另一套工具是 Multivalent Document Tools。当然,这类程序更难自动化,不过我过去曾用简单的 FIG 矢量图形文件格式(参见 Xfig)以自动方式生成放置了文本和图形的 Postscript 和 PDF 文档。图像转 PDF 转换器……工具 sam2p 专门用于将图像转换为 PDF 文件。所以用 ImageMagick 做所有预处理,然后用 "sam2p" 进行最终转换。它甚至带有一个小脚本,可以把结果调整到 A4 纸张。来自 sam2p README: Q58) sam2p 能否生成一个按比例缩放(即保持宽高比)到指定页面尺寸并在页面上居中的 PDF?
A58) 不能,但随 sam2p 捆绑的 Perl 脚本 sam2p_pdf_scale.pl 可以对 sam2p 创建的文件进行后处理。例如,要在 A4 纸上缩放并居中一个 PDF,请执行:
sam2p input.img output.pdf
sam2p_pdf_scale.pl 595 842 output.pdf

不幸的是,它对 IM 创建的默认 PDF 不起作用。-- Sebastian Krause,来自 IM 用户邮件列表 多页 PDF 文档……你可以使用 perl 来组合多个 PDF 文件,而无需借助 IM 及其栅格化问题……

#!/usr/bin/perl
#  Script   pdf-combiner.pl
use strict;
use warnings;
use PDF::Reuse;

prFile('combo.pdf'); # Output.
for (qw/a b c d/) # Inputs.
{
  prImage("result_$_.pdf");
  prPage();
}
prEnd();

你还可以使用一个 JAVA 工具包将 IM 生成的图像合并到一个 PDF 中,生成一个比 IM 将生成的更简单 PDF 更好的 PDF……

#!/bin/bash

for x in ./*.jpeg
do
    echo $x to ${x}.pdf
    magick $x -quality 75 ${x}.pdf
done

echo Merging...
java tool.pdf.Merge *.pdf

IM 讨论论坛 上的另一位用户还建议使用 PDFjam 将多个 PDF 页面合并到一起。


PbmPlus / NetPBM 图像文件格式:PBM PGM PPM PNM PAM

PbmPlus 或 "NetPBM" 图像处理过滤器(unix 命令行)。这些图像格式有多种样式:"PBM"(位图)、"PGM"(灰度)、"PPM"(彩色)、"PFM"(浮点,用于 HDRI)、"PAM"(任意格式)和 "PNM"(任何 NetPBM 格式)。这些格式中的每一种("PAM" 和 "PFM" 除外)还可以是'原始'二进制形式(IM 或 NetPBM 写入时的默认形式),或纯 ASCII 文本格式(使用 "[-compress](https://imagemagick.org/command-line-options/#compress) None" 设置)。IM 当然可以读取它们中的任何一种。该格式应被视为仅使用"线性 RGB(linear-RGB)"色彩空间,而 使用大多数其他图像文件格式所用的 "sRGB"。然而,使用"线性 RGB"时应使用 16 的位深,所以建议谨慎,以避免在位深 8 的图像中产生严重的舍入误差。NetPBM 格式通常每个文件保存一张图像。然而 IM 以及许多其他 NetPBM 实用程序都会读取和写入将多张图像简单地拼接在一起的文件。因此,在写入图像时,写入文件时设置适当的 "[-/+adjoin](https://imagemagick.org/command-line-options/#adjoin)" 设置可能是个好主意。(详见 写入多图像序列)。PPM 文件格式对 ImageMagick 实际上尤其重要,因为它是在经由 "ghostscript" 委托转换 Postscript 和 PDF 图像期间所用的通信格式。它也是视频图像处理(例如来自 "ffmpeg" 命令)的一种主要格式。输入时可以使用任何'质量'或值范围(高达 16 位即 65535 的'位深')。例如,这里是一个非常不寻常的值范围 5,用于生成一个'阶梯渐变'。我不知道还有哪种其他图像格式允许你使用这样一个古怪的质量范围。 |

  echo "P2 6 1 5   0 1 2 3 4 5" | \
      magick - -scale 120x20  pgm_step_gradient.gif

[IM Output]
另请看 调整大小的渐变,其中使用 NetPBM 文本图像来创建非常小(2 到 4 像素)的图像。上面的例子还演示了 'ASCII' 子格式可以多么有用。尤其是作为将图像加入到 shell 脚本中的一种方法,或作为从一个数字数组生成图像的方法。例如,参见 TXT: 枚举像素格式。这种用法的一个例子在 直方图重分布方法论 示例中展示。

PbmPlus/NetPBM 与 ASCII 数据格式

它的 ASCII 输出可能是从特定图像中提取颜色值的最干净的方法,这再次使它非常适合脚本和简单的图像处理。

  magick -size 20x2 xc: +noise random -channel G -separate +channel \
          -depth 16  -compress none   pgm_random_values.pgm

[IM Text]

请注意,当输出是纯文本时,行的写入方式并不会与图像的行长度对齐。但你可以使用各种 UNIX 文本实用程序重新格式化输出。例如,你可以使用 "tr" 文本实用程序将多个逗号和空格替换并压缩为单个换行符,把所有值变成每行一个值,使脚本更容易处理。此外,对于 PGM 和 PPM,IM 只允许你为输出质量指定 8 或 16 的'位深'。而 PbmPlus 格式允许为其值使用任何'maxval',甚至是不为 2 的幂的值!它确实有一个 16 位位深(maxval 65535)的硬性限制。目前还无法对 NetPBM 图像的实际'maxval'进行更精细的控制,不过将来可以通过一个特殊的编码器设置来添加(如有需求)。这里是另一个例子,输出从 rose 内置图像中提取的一个 9x9 灰度值阵列,值从 0 到 255。我使用了 "pnmtopnm -plain",这样我们在每个像素行的末尾得到一个换行符。

  magick rose:[9x9+0+0] -colorspace gray -transpose -depth 8 PGM:- |\
    pnmtopnm -plain

[IM Text]

这个 NetPBM 命令的较旧变体包括 "pnmnoraw" 和 "pnmtoplainpnm",它们与 "pnmtopnm -plain" 做相同的事情。请查看你的 NetPBM 软件包的手册页,因为开发者们似乎对它该如何完成拿不定主意。这些 PbmPlus 程序中的任何一个都会在'图像行'的末尾输出一个换行符,而 ImageMagick 编码器不会这样做。这可以让脚本中的图像处理容易很多。这里是一个输出非常小的 ASCII PBM 位图的例子。

  magick label:O pbm: | pnmtopnm -plain

[IM Text]

请注意,PBM 位图甚至不需要在值之间输出空格,尽管它们是允许的(IM 会输出它们,PbmPlus 实用程序不会)。还请注意,对于位图,白='0'(背景),黑='1'(前景)。这是 XBM 和 PBM 等位图格式的标准,ImageMagick 理解这一惯例。如果这不是你想要的,请 取反(Negate) 图像,或使用 按颜色调整图像色阶 来设置位图图像所需的颜色。

PbmPlus/NetPBM 位深控制

有时候你想对 PGM 和 PPM 图像的位深有更多控制,例如使用从 0 到 99 的百分位值范围。一种方法是使用 NetPBM 程序 "pamdepth",它可以将图像魔法(magick)到任何范围(高达 65335 的内部限制)。例如,这里是一个值的图像阵列,但使用了 0 到 99 的输出值范围。

  magick -size 9x9 radial-gradient: -depth 16 PGM:- |\
    pamdepth 99 | pnmtopnm -plain

[IM Text]

这里是另一个例子,但这次使用 反向色阶(Reversed Level) 运算符来设置输出值范围。这可以让你对值的变换有更多控制,但 PGM 图像中的'maxval'与图像的最大值不匹配。

  magick -size 9x9 radial-gradient: +depth +level 0,99 PGM:- |\
    pnmtopnm -plain

[IM Text]

上面命令中的 "[+depth](https://imagemagick.org/command-line-options/#depth)" 对于将图像文件的位深设置为与 IM 质量级别相同至关重要。所需要做的只是把第三行重置(或忽略)为 '99' 的值,并可选地将图像压缩回'原始'二进制 NetPBM 图像格式。然而,由于 PbmPlus/NetPBM 的最大位深为 65535(16 位),这只对 IM 的 Q8 或 Q16 版本有效。

PbmPlus/NetPBM 注释

IM 会读取、写入并保留 PbmPlus/NetPBM 文件格式头部中的'注释'行。例如……

  magick -size 2x2 xc:grey -set comment "by Anthony" -compress none PGM:-

[IM Text]

不过话虽如此,大多数应用程序(包括 PbmPlus 本身)会忽略此类注释,甚至在处理文件时丢失它们。

  magick -size 2x2 xc:grey -set comment "by Anthony" PGM:- | pnmtopnm -plain

[IM Text]

PbmPlus/NetPBM 与 ImageMagick

PbmPlus/NetPBM 图像处理套件曾经是 ImageMagick 在命令行图像处理方面的竞争对手,但它在图像处理上使用一种完全不同(更底层)的管线过滤哲学。这使它易于在 shell 脚本中使用,但更难用于一般或非常复杂的图像处理。这也意味着图像被转入和转出图像文件格式的频率高得多,并且通常需要使用许多临时文件。PbmPlus/NetPBM 图像一般不处理透明度(不过较新的 PAM 格式可以),并且没有提供一种随图像数据传递图像元数据的通用方法。所有 PbmPlus/NetPBM 格式(如 ImageMagick 内部格式,参见 MIFF 图像流式传输)都可以处理多张图像的流,只需将图像简单地拼接或追加在一起,一张接一张。这使它非常适合流水线化、多图像流式的图像处理方法,例如用于视频处理。然而请注意,某些 PbmPlus/NetPBM 程序只处理单张图像,不会处理多张图像的流。不过,由于它更底层,且早于 ImageMagick,它常被选用于原始图像输出,例如视频图像的输出和处理。PbmPlus 图像也更常用于科学数据,因此此类图像通常存储为'线性 RGB(linear-RGB)'色彩空间,而不是更常见的非线性 'sRGB' 色彩空间。建议谨慎。两个软件包可以共存,我也曾被人知道在某些事情上使用 PbmPlus/NetPBM 实现而不是 ImageMagick。通常是在使用特定的底层图像处理,或使用以图像形式存储的值数组进行脚本编写时。这两个软件包配合得很好,建议都安装并用于正经的图像工作。 | _我实际上就是在 1995 年那个该软件几乎无人维护的时期发布 NetPBM 关键补丁的人。正因为如此,我对 PbmPlus 软件及其简单的图像文件格式有很好的理解。

此后它被不同的人重新开发了若干次,最终似乎成了一个正经的开源项目。各个程序似乎正在成熟,并开始更好地协同工作。

然而它的主要问题——缺乏元数据和复杂性——依然存在。但它作为文件格式的简单性是它最大的优势,使它非常适合非常底层的图像和数据操作。

_
---|---


TIFF

  The TIFF format is the propriety format for PhotoShop.  However it is so
  bloated with features, and has been modified by just about every application
  that has cared to use it, that no program, not even photoshop can handle ALL
  its variations.  Photoshop however has the best chance at reading it.

  I would steer clear of the TIFF image file format unless you are
  specifically working with photoshop, or the application accepts no other,
  better defined, image file format.

  I don't use the TIFF image file format, or Photoshop. If you use this format
  with IM extensively, perhaps you would like to submit your findings to me,
  to include here.  That way you  can help your fellow TIFF users.

  Whether a specific software package can read a TIFF, all you can do is try
  it and see.  That is, the problem with this format.



  TIFF and Density (resolution) in photoshop...

  See [Photoshop and Density](basics.html#density_photoshop)
  for the details and solutions to this problem



  JPEG to TIFF conversion...

    magick image.jpg image.tif

  This will either save the image inside the TIFF file using JPEG compression
  (which was inherited from the JPEG input.  Or it will error such as...

      Error: "JPEG compression support not configured"

  This is caused by the TIFF library not including JPEG compression support.

  Either way  THIS IS BAD.

  You can get around this problem by changing the setting to use a different
  compression algorithm:

      magick image.jpg -compress zip  image.tif
      magick image.jpg -compress lzw  image.tif
      magick image.jpg +compress      image.tif

  WARNING:  -compress Group4  with a TIFF works, but ONLY if you remove all
  transparent and semi-transparent pixels from the image.  Typically you can
  make sure this is done the same way as JPEG images above, using
     -background {color} -alpha remove
  See [Removing Transparency from Images](masking.html#remove)
  just before the final save (the first only works for single images).



  TIFF (and MIFF)  floating point precision files (Add to IM v6.2.6-5)...

  This is especially good for HDRI image processing (which uses floating point
  inside IM itself)

  For single precision (float) set...
         -depth 32 -define quantum:format=floating-point
  For do8uble precision (doubles) set...
         -depth 64 -define quantum:format=floating-point

  14 bit TIFF images...
       magick logo: -sharpen 0x1 -depth 14 logo.tif

       tiffinfo logo.tif

       Image Width: 640 Image Length: 480
       Resolution: 72, 72 (unitless)
       Bits/Sample: 14
       Compression Scheme: LZW
       Photometric Interpretation: RGB color
       FillOrder: msb-to-lsb
       Orientation: row 0 top, col 0 lhs
       Samples/Pixel: 3
       Rows/Strip: 2
       Planar Configuration: single image plane
       DocumentName: logo.tif
       Software: ImageMagick 6.2.8 07/27/06 Q16 https://imagemagick.org

  12 bit TIFF images...

  To magick 16-bit TIFF images to 12-bit:
        magick image.tif -depth 12 image-12.tif

  Pure black and white images...

       magick image ...  -type truecolor -type bilevel   image.tiff

    Results in normal images and the smallest filesize, and correct
    black/white handling in Photoshop, Microsoft Windows Picture and Fax
    Viewer.
       [TIFF discussion](https://magick.imagemagick.org/viewtopic.php?p=51723),
       _[RQuadling](https://magick.imagemagick.org/memberlist.php?mode=viewprofile&u=7913)_.


  Enden and fill-order
    The order in which TIFF data values are stored is controled by
       -endien                   Global order of the bytes
       -define tiff:endian       Tiff format container endian
       -define tiff:fill-order   Bit order within a byte

    Each takes a value of either MSB (default) or LSB, however
    the "tiff:fill-order" will be set to the value of "tiff:endian"
    if that is defined, but not from the global endian value.

    The "tiff:endian" property is the endianess of the image container. The
    "-endian" property is the endianess of the image pixels. They may differ.


  Save a TIFF file format with only one row pre strip

          -define tiff:rows-per-strip=1.
    To save more rows per stripe increase the number
          -define tiff:rows-per-strip=8
    You can also specify the 'endian' ordering for binary integers in the format
          -endian MSB          -endian LSB

    For smaller TIFF images (other than by compression, you can also try to
    use options and settings like   -depth 8   to reduce the color quality
    or   -alpha off  to remove the alpha or transparency channel from the image.

    IM will save a greyscale image as a greyscale TIFF, if no non-grayscale
    colors are present. You can force it to save as non-greyscale with
          -depth 8  -type TrueColor


  Added IM 6.6.4-3
    Allow you to set the "Software Creation:" meta-data (property)
    to something other than "Image Magick 6.**"
        -set tiff:software "My Software"


  Windows Picture and Fax Viewer, Windows Explorer

    These can can only display TIFFs that have certain Photometric
    Interpretation values, such as RGB.  IM Options...
        -compress LZW -type TrueColor

    toggle the photometric interpretation  (Added IM 6.3.2-10)
        -define quantum:polarity=min-is-black
        -define quantum:polarity=min-is-white


  Multi-Page TIFF
    If you want to split a multi-page tiff into separate pages, IM may have
    problems as it will still use up a lot of memory to hold previous pages
    even if you use a command like...
        magick "a.tif[i]" b%03d.tif

    This might be regarded as a bug, or perhaps a future improvement.

    The better solution may be the non-IM "tiffsplit" program.


  TIFF and EXIF profiles

    Cristy reported: The libtiff delegate library supports the EXIF profile
    but it was unreliable and caused faults too often so we commented out the
    call.

    To get the EXIF attributes try this.

      magick identify -verbose -define tiff:exif=true image.tif

TIFF 格式可以有一个剪辑路径(clip path)形式的位图蒙版,可以使用 "[-clip](https://imagemagick.org/command-line-options/#clip)" 运算符来启用它。你可以使用以下方式用该路径对你的图像进行'剪辑'蒙版……

  magick image_clip.tif  -clip \
          ...do_various_operations... \
          +clip-mask  image_masked.png

更多细节参见 写入蒙版或剪辑蒙版


BMP,Windows 位图

  The Windows desktop icon image format BMP (short for bit-mapped) is a very
  unfriendly image format and should probably be avoided if possible.

  ImageMagick supports 8, 24, and 32-bit BMP images.

  Add -colors 256 to the end your command line (before the output image
  filename) to create a 8 bit colormapped BMP image rather than a 24 bit BMP
  format.  Extra colors can be added to images after performing operations
  like rotates, and resize.  See Color Quantization for more info on -color.

  The presence of any transparency controls whether it uses a 24 (RGB) or 32
  bit (RGBA) format BMP image. You can use "-alpha off" to turn off transparency
  in an image.

  If all colors are gray-scale a 'directcolor' greyscale image is generated.
  I think -type truecolor will stop this behaviour.


  If you have an older program cannot read the default BMP4 images written by
  ImageMagick, (for example a Windows Background Image), you can enforce the
  generation of a BMP3 format image using...

       magick image BMP3:image.bmp

  This format should have no transparency and should be a 'printable image',
  whatever that means.  In other words 'Windows' compatible.

  However, if a PNG input file was used and it contains a gAMA and cHRM chunk
  (gamma and chromaticity information) either of which forces "magick" to
  write a BMP4. To get a BMP3 you need to get rid of that information. One way
  may be to pipeline the image though a minimal 'image data only' image file
  format like PPM and then re-save as BMP3.  Messy, but it should work.

      magick image.png  ppm:- | magick - BMP3:image.bpm

  IM can not produce BMP's at depth levels other than 8.  However you can
  use NetPBM image processing set to do the final conversion to other depth
  levels (This needs at least a Q16 version of IM)...

       magick image -alpha off -colors 16 ppm:- |\
         pnmdepth 4 | ppm2bmp > image.bmp


  Format limitations....

  The header for a BMP2: format only allows the description of the width,
  height and bit depth (bits per pixel) of an image. The bit depth can be one of
  1, 4, 8 or 24.

  For comparison, the bmp3: format allows bit depths of 0, 1, 4, 8 ,16, 24 and
  32 and has extra fields which specify x and y resolution (in pixels per metre)
  and compression of the image data.

ICO

  To create a multi-resolution ICO format image simply create all the image
  sizes you require and write them all to the same ICO file.

    magick icon-16.bmp icon-32.bmp icon-64.bmp \
            icon-128.bmp icon-256.bmp   myicon.ico

  Update

    magick icon-256.png  \
            -define icon:auto-resize="256,128,96,64,48,32,16" \
            myicon.ico

You can now add this to you web pages using
  <LINK REL="shortcut icon" HREF="myicon.ico">

However many web browsers will now accept most image formats, not just the
ICO format.

RAW 相机图像格式(CRW,CR2,NEF,X3F,等)

大多数数码相机(除 Sigma Foveon 传感器和一些索尼相机外)通过使用数百万个检测某种特定颜色(红、绿或蓝)亮度的传感器,把镜头产生的图像魔法(magick)成数字数据。为了让相机以与人眼大致相同的方式响应颜色,绿色传感器的数量是红色或蓝色传感器的两倍,因为我们的眼睛对绿光要敏感得多。这些传感器排列成被称为拜耳阵列(Bayer array)的形式。关于这种排列的描述和示意图,例如,参见 Understanding Digital Camera Sensors。将数据从拜耳阵列转换为更熟悉的 RGB 像素需要一个称为去马赛克(demosaicing)的过程。完成此操作后,我们仍没有一张值得显示的图像。即使有了额外的绿色像素,相机的传感器仍不像我们那样感知颜色。如果你拿一张白纸,在明亮的阳光下看它,然后走进室内在荧光灯下看它,它在两种条件下看起来都是白的。但如果你用默认相机设置在这两种相同条件下拍摄这张纸,当显示在屏幕上时,这张纸会显示略有不同的颜色。原因是,虽然我们视网膜的后部会"看到"与相机相同的从纸上反射的光,但我们的大脑会为我们解读那束光,于是我们会把纸感知为白色。相机只是测量从纸上反射的红、绿、蓝光的量,而在荧光灯下蓝光会比阳光下更多,所以那张图像中的纸会比在阳光下拍摄的看起来更蓝。要生成都显示一张白纸的图像,需要对它们进行"白平衡",也称为灰平衡或色彩平衡。关于白平衡的更多信息,参见 Understanding White Balance。raw 文件还有其他一些方面必须处理,例如设置正确的伽马,但不深入更多细节也很清楚,raw 文件在能成为我们可以在显示器上查看的图像之前,需要大量的处理。相机 raw 文件常被称为数字底片。如果你拍一张照片并让相机生成一张 JPG 图像,它会完成去马赛克和所有其他调整。但如果,例如,你在拍照前忘了在相机里设置正确的白平衡,你其实没法用 JPG 做太多来纠正这种情况,因为关于原始图像的大量信息已经丢失了。另一方面,如果你从相机生成了一个 raw 文件而不是 JPG,那么在从 raw 转换的过程中,你可以选择一个特定的白平衡设置以及其他参数,如果所得图像看起来不对,你可以回去更改设置,再把它魔法(magick)一遍,直到它看起来对。这类似于从胶片底片冲印更多照片的能力。没有胶片底片,你就无法从胶片首次冲洗时得到的那些 4x6 快照中的一张放大出一张 8x10 的大图。虽然 ImageMagick 可以处理种类繁多的不同格式,但它不'知道'如何魔法(magick)相机 raw 文件,所以 IM 使用 "[dcraw](http://www.cybercom.net/~dcoffin/dcraw/)" 程序作为委托程序,把 raw 文件魔法(magick)成它确实能理解的格式,即 TIFF(带 '-T' 标志)或 PNM。请注意,它是为 raw 相机 图像设计的,而不是为来自例如扫描仪的图像设计的。"[dcraw](http://www.cybercom.net/~dcoffin/dcraw/)" 程序可以处理大量不同的 raw 格式,包括来自 Canon、Fuji、Kodak、Nikon 和 Sony 制造的相机的格式。你可以通过让 "dcraw" 识别一个样本来确定它是否会识别你的 raw 文件。例如命令:

  dcraw -i CRW_9641.CRW

返回……

CRW_9641.CRW is a Canon EOS 10D image.

当 IM 调用 dcraw 来做转换时,使用 委托(用 "-list delegate" 列出),指定两个影响图像处理的标志:

 dcraw -w -4 -O output_file input_file

'-w' 标志意味着 dcraw 在能找到的情况下会使用 raw 文件中的白平衡信息。如果找不到该信息,dcraw 会使用整张图像的平均值作为白平衡的基础。'-4' 标志意味着 dcraw 只会对 raw 照片进行去马赛克和白平衡,并将结果输出为一张 16 位线性图像(每像素 48 位),适合默认的 Q16 版本的 IM。由于 '-w' 和 '-4' 是仅有的两个指定的图像处理标志,所以 dcraw 会使用一些默认值。输出色彩空间将是 sRGB,且不进行 ICC 配置(在我的系统上,dcraw 编译时没有 LCMS 库,所以它无法进行配置)。设置了 '-4' 标志这一事实意味着许多处理步骤被省略了,包括色阶调整和伽马校正,因此所得图像 会看起来很暗。其意图是用户将使用诸如 "Photoshop" 或 "Paint Shop Pro",甚至 "ImageMagick" 这样的图像编辑器来处理图像,并自己进行色阶、伽马等的调整。在这种情况下,图像应被输出为一种支持每种颜色 16 位的格式。(例如 TIFF)。请注意,dcraw 生成一个 16 位文件并不意味着所有 16 位都包含有用数据。例如,来自 Canon 10D 数码单反的 raw 图像每种颜色有 10 位。Canon 和其他制造商较新的相机每种颜色有 14 位。如果你想让你的 raw 照片被完全转换,你将不得不移除 '-4' 标志,这样 dcraw 才会进行去马赛克、白平衡、亮度和伽马校正等。在这种情况下,dcraw 输出一个 8 位文件(每像素 24 位)。如果你打算对这张图像做进一步处理,最好把它输出为 PNG,避免 JPEG 压缩伪影。JPEG 格式应当只作为实际使用的最后一步。事实上,在图像处理的中间步骤中使用诸如 PNG(或 IM 内部格式 MIFF)这样的无损格式总是个好主意。可以添加一个特殊的 DCRaw 委托,它让你控制如何读取'raw'相机图像格式。更多信息请查看 DCRaw 网站,以及 DCRaw 教程网站,后者有一些关于 dcraw 许多可选标志的信息,包括使用各种标志的 raw 图像直方图。另请参见 DCRaw by Example。上述笔记最初摘自 IM 论坛主题 Converting RAW images,由 jhfry 撰写,并由 el_supremo 进行了大幅重写。


MPEG、M2V 和 AVI 影片

  IM is not very efficient at creating movies.  It will do the job though
  requires the external program "mpeg2encode" to do much of the dirty work.

  The problem is that IM is not designed to handle video, but static images or
  small sequences of images.  That is, not to say it can't do it, but that is
  not its goal.  In particular it generally reads in all images into memory
  and process them from there.  For a large or long video this is not very
  efficient.

  For processing on a small sequence of frames however it really can't be
  beat.  In fact just about every Linux Video manipulation program uses
  ImageMagick to generate titles, fancy scene changes, and other effects to
  complete the post-processing development of a larger video development.  The
  process however is kept to small video sequences.

  However lets have a look at what IM can do.

  **Frames to Video**

  There are some reports that unless the images are the right aspect ratio is
  correct this will fail on older mpeg players,  use the MPEG II extension
  (m2v:) instead.

  Also use m2v to avoid heavy compression pixelization that can occur
  using...

      magick *.jpg glacier.mpg

  EG instead use...

      magick *.jpg m2v:glacier.mpg

  Note you may need lots of temporary space to do a large animations
  You can specify a different directory from the normal /tmp using...

      setenv MAGICK_TMPDIR /data
      magick -limit memory 0 -limit map 0 *.jpg image.m2v

Alternatives...

  To converting PNG images to MPEG2 Video streams, instead of MNG Multi
  PNG-files, use the following delegation...

       png2yuv -j file%08d.png -I p -f 25 -b 1 | \
         mpeg2enc -f 3 -q 3 -b 5000 -o out.m2v

  For more info see [mjpeg.sf.net](http://mjpeg.sf.net/)


  IM forums reported decent results with an open source project called "[ffmpeg](http://ffmpeg.org/)", which seems to be a fairly standard
  linux package install.

     ffmpeg -f image2 -i %03d.jpg -vcodec mjpeg -y anim.mpg

  Extracting an MVG with a transparent background
      magick -background none -size 320x240 sample.mvg out.png


  Michael Lenh wrote...
  I finally was able to create a very sexy video using mplayer

    mencoder "mf://data/p*.png" -mf fps=40 -o particle.avi -ovc lavc

  You can see the results at...

    http://www.mathematik.uni-ulm.de/~lehn/particle.avi
    http://www.mathematik.uni-ulm.de/~lehn/temperature.avi


  [mabu](https://magick.imagemagick.org/memberlist.php?mode=viewprofile&u=19117) in a [IM Forum Discussion](https://magick.imagemagick.org/viewtopic.php?f=1&t=18724) said to
  "_USE MENCODER, wow it's like 1000 times faster and actually WORKS_ "...

     mencoder -nosound mf://*.jpg -mf w=800:h=371:type=jpg:fps=15 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2160000:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o output.mpg

  It probably has extra options I don't need but it makes a nice time-lapse
  from .jpg files.


  Dean S. Messing uses transcode...

     find . -type f -name '*.png' | sort > filelist
     transcode -x imlist,null\
            --use_rgb\
            -y raw,null\
            -f 60\
            -i filelist\
            -g 4096x2160 \
            -j 540,1024,540,1024\
            -o video.avi\
            -H 0

   You can leave out -j  (clip window) if you want. -g is output size.

   Wolfgang Hugemann suggests a new alternative known as 'VirtualDub' under
   Windows Vista, which will let you run a video, or magick directly from
   a folder of image frames.

   WARNING: "mplayer" apparentally does not like mpeg file with
   only one frame. "ffplay" however seems to have no problems.


   **Video to Frames**

   Both "[mplayer](http://www.mplayerhq.hu/)" and
   "mencode" are more efficient at converting video into a series
   of frames than IM is.  On top of this is can handle just about any video
   (and audio) codec available.

   For example to grab 5 frames from 1 1/2 minutes into a video, scaled to
   320x240, you can use...

      mplayer file.mov -vf scale=320x240 -ss 01:30 -ao null \
              -vo png:z=3 -frames 5

   Other alternatives include the "[ffmpeg](http://ffmpeg.org/)" open source library, though that is also part of the
   "[mplayer](http://www.mplayerhq.hu/)" handling.

MNG,Multiple-image Network Graphics

Barry Loo 贡献,来自 Example Ming Animation 讨论。 MNG(读作 ming)是一种基于 PNG 的开放格式,提供了 GIF 等格式的动画位图替代方案。它允许透明度(半透明和全透明)、压缩(有损和无损),以及高达 32 位的颜色深度。增加的颜色深度才是真正让这种格式区别于其他格式的地方。GIF 总共只支持最多 256 种颜色,这对许多图形来说没问题;然而,照片和渐变会因此劣化。在创建 GIF 动画时可以使用的大多数动画选项,也可以用于创建 MNG。 |

magick -size 101x101 radial-gradient: \
        \( -clone 0 -level 00,100% +level-colors ,#F00 \) \
        \( -clone 0 -level 10,100% +level-colors ,#F12 \) \
        \( -clone 0 -level 20,100% +level-colors ,#F24 \) \
        \( -clone 0 -level 30,100% +level-colors ,#F36 \) \
        \( -clone 0 -level 40,100% +level-colors ,#F46 \) \
        -delete 0  -duplicate 1,-2-1 -set delay 1x30 -loop 0 pulsing.mng


上面的命令生成一张 radial-gradient(径向渐变)图像,然后将其克隆并调整,以创建一个从红色到更亮的红橙色的脉动。然后再将其复制,在创建一个 30 秒、循环的 MNG 动画之前,先创建一个反向的 巡逻循环(Patrol Cycle)。不幸的是,大多数 Web 浏览器目前不支持 MNG,许多视频播放器只显示循环动画的一遍。如果你点击上面缺失的图像帧,你可以下载该动画,并使用 IM Animate 命令 查看它。关于 MNG 格式的更多信息,请访问 MNG Web 站点


DPX,数字图像交换格式

这种格式用于电影和特效行业,它特别善于利用大量的头部信息,以及该格式在能够使用 RGB 或 YCbCr 像素描述、以各种位深处理高动态范围和对数颜色值方面的灵活性。它基于但在很大程度上取代了 Kodak 的 Cineon 格式,后者有一个更针对胶片的头部。它的一个使用示例是在为后期制作扫描胶片时。每一帧都会被存储为一个单独的 .dpx 文件,范围从 2k(宽 2048 像素)到 8k(宽 8192 像素——用于 IMAX 帧),每个颜色分量从 8 到 64 位不等。然后可以使用合成软件处理这些文件的一个序列,更改颜色或添加视觉效果。完成后,它们可能会被数字化地录制到磁带上,或重新投影回胶片上。每个像素的颜色值通常按对数存储(尤其是如果该序列最终要被转回胶片上),这更自然地反映了颜色信息在原始胶片乳剂中存储的密度。在未经修改地查看时,对数文件看起来对比度非常低,因此需要一个'查找表(look up table)'来把对数图像转换成类似于如果图像被转回胶片并在影院投影时你可能看到的东西。除了使图像线性化(像大多数典型的计算机图像那样)和调整伽马级别之外,该表还设置黑点和白点所在的位置。对于一张 10 位对数图像,其中每个颜色分量值范围从 0 到 1023,黑点和白点通常分别设置为黑点 95 和白点 685。这意味着对数文件存储的颜色值,比线性版本将显示为纯白的更亮,比它将显示为纯黑的更暗。因此,对于可能希望在图像被存储为 dpx 文件后更改其亮度的特效艺术家来说,这些额外信息仍然可用。例如,如果这些信息丢失了,均匀地降低一张图像的亮度会导致高光变暗,而有了这些额外信息,高光反而会缩小尺寸,并开始显示以前因太亮而看不到的细节。后者远更接近现实世界中发生的情况。头部可以包含与某个制作相关的电影和/或电视特定数据。例如,电视头部可以包含一个 SMPTE 时间码,这样从某个制作的剪辑中导出为 dpx 序列的镜头,一旦添加了任何特效,就可以轻松替换。胶片头部保存了关于这些帧所源自的胶片卷以及拍摄时所用各种相机设置的信息。当这些图像在后期制作公司之间传递时,所有这些细节就会随图像一起保留下来。

向 DPX 文件添加时间码

你可以使用以下方式向任何 dpx 文件添加时间码:

  magick -define dpx:television.time.code=10000215 \
          originalFile.00001.dpx    alteredFile.00001.dpx

对构成一段来自胶片或动画的序列的数千个文件中的每一个执行此命令,显然会花费很长时间。可以将一个简单的脚本与 ImageMagick 一起使用,为序列中的每一帧自动递增时间码。例如,参见 Perl 脚本 dpx_timecode.pl
上述内容的一份副本已被添加到主 IM 文档的 Introduction to Motion Picture Formats。以上承蒙 Seth Dubieniec 提供,来自一个关于 DPX 格式的长篇 IM 论坛讨论。他目前正在开发 DPX 应用程序,所以可能会有更多 DPX 信息陆续到来。

**Extra Notes (unformatted)...**

Adding  -depth 10  causes IM to output a  10 bit DPX file.
-- James Fancher


If you want to set the gamma, for example, in the output DPX image...
     -define dpx:television.gamma=1.7

The colorspace of the DPX image is defined by the image element descriptor and
transfer-characteristic. If the transfer characteristic is
PrintingDensityColorimetric we set the colorspace to LogColorspace. Only if
the colorspace is Log do we apply the gamma and black/white points to convert
to the RGB colorspace. Its possible the program you are using is not
conforming to the SMPTE standard or ImageMagick is not interpreting the
standard correctly. Post an URL to your two DPX images and we will download and
try to determine if ImageMagick has a bug or if the program you are using is
buggy.

The following will work with ImageMagick 6.3.8-3

  magick -colorspace log AfterEffectsFile.dpx -set gamma 0.5 \
          -set reference-black 95 -set reference-white 685 image.jpg

Alternatively, take a look at the SMTPE documentation
-- Cristy


You can add text user data to the dpx file by using

  magick image.dpx   -set dpx:userdata "some text"    new.dpx

-- Cristy

PSD

PSD 图像文件是 Photoshop 的工作图像文件格式,正如 XCF 是 GIMP 的工作文件格式,MIFF 是 ImageMagick 自己的工作文件格式。它们通常包含多张图像,第一张图像是当前工作图像的一个一体化合并。这使它对查看当前状态的工作图像很有用,通常用于'缩略图化'。多图像文件格式中所有其他图像都是用来生成第一张合并图像的图像。也就是说,是用户在保存时正在处理的各个工作图层图像。所以如果你只想要'最终'图像,我建议你在输入文件名后追加一个 " '[0]' ",以丢弃工作图像,只使用一体化的第一张图像。然而,如果你打算处理各个图层图像,那么使用 " '[1--1]' " 来跳过第一张图像。如果没有找到额外的图层图像,那么将返回第一张图像。我 建议使用 "-delete 0",因为如果第一张图像之后没有图层图像,那将完全不返回任何图像。额外笔记……如果你能提供更多信息,或愿意提交一份使用 IM 处理这种格式的总结,那么请务必……

   For PSD with a CMYK image you may need to get IM to use the
   right provide when converting (make sure you IM was installed with the LCMS
   delegate library) ....

     magick Test_CMYK.psd -strip -profile USWebCoatedSWOP.icc \
             -profile sRGB.icc Test_RGB.png

   See [Profiles](#profiles) above for more info.


   If a PSD image contain a 'preview' image.  This image is returned as the
   last image of a two image read.

   To ensure IM never reads the last image use...
       magick test.psd[0--2] -flatten test.jpg
   That is, read all images, except the last. But always read the first.
   This can not be done after the read using a "-delete".

WMF

另一种矢量格式,常用于 Microsoft Office 套件程序所使用的可缩放剪贴画。可以在读取图像之前更改 "[-density](https://imagemagick.org/command-line-options/#density)" 来缩放输入。另请参见 矢量图像格式


Flash 动画 (SWF)

Flash 动画目前不受 IM 支持。但仅为完整起见,Scott Bicknell 报告说 SWF Tool 实用程序 "swfextract" 可以从 flash 动画中提取 jpeg 或 png 帧。Wolfgang Hugemann 还认为 Windows 免费软件工具 "IrfanView" 也许也能做到这一点。在我看来,这听起来像是个不错的委托候选。


网页转换为图像 (HTML)

如果 IM 加载一个 HTML,它会去寻找一个 html2ps 来把 html 魔法(magick)成 postscript,然后它就能把它渲染成图像。这效果不是很好,但确实可行。使用一个完整的 Web 浏览器是好得多的方法,因为它就是被设计来以尽可能最好的方式完成这项任务的。使用浏览器最简单的方法就是把页面加载到浏览器中,然后对它截屏。这能得到一张该页面的完美图像,但受限于浏览器的窗口大小。另一种变体是让浏览器把页面输出为 postscript,而不是让 IM 去魔法(magick)它。这应该能相当不错地把网站分页成更小的页面。在 LINUX 下,你可以启动一个足够大的虚拟 X windows 显示服务器,以运行一个显示整个网站的浏览器。这可能是一个非常高的显示。然后在其中运行浏览器,并设置为填满整个显示。加载网站,然后再次抓取截屏。我见过一个甚至能自动化整个复杂过程的脚本。然而,你最终可能会得到一张非常长的图像。同样,很难知道该把显示做多大。基本上,这并不容易,最好的解决方案只用 IM 做最终的图像处理,而不是 html 到图像的生成。


PCL 打印格式

IM 的 PCL 默认是版本 6 的 PCL。对于版本 5,你需要把你的图像魔法(magick)成黑白。例如……

  magick image.png -monochrome image.pcl


Kodak PhotoCD 或 ProPhotoCD (PCD)

Kodak PhotoCD 文件是一种多分辨率图像文件格式。也就是说,每个文件以 6 种不同尺寸包含同一张图像,形成一种被称为'金字塔图像(pyramid image)'的东西。文件中的第一张图像是最低分辨率(最小尺寸),最后一张是最高分辨率(最大尺寸,3072×2048 像素)。由于用户通常想要最大分辨率的图像来处理,把 PCD 图像魔法(magick)成 JPG 等其他格式的方法是从图像文件中抓取第六张(即索引 5)。例如……

  magick -colorspace RGB image.pcd[5] image.jpg

为了得到正确的颜色,需要 "-colorspace RGB" 选项。信息承蒙 Wolfgang Hugemann 提供,来自 Magick-Users 邮件列表。


原始 RGB 与灰度数据

ImageMagick 有一些用于处理原始图像数据的文件格式,具体来说是 "RGB:" 和 "GRAY:"。同时也提供了定义该数据的设置。例如,要输出 RGB 原始数据……

  magick image.jpg -depth 8  image.rgb

"[-depth](https://imagemagick.org/command-line-options/#depth)" 设置指定所写入(以及之后读取)整数的大小。在这种情况下,是 8 位值,RGB 每像素 3 字节(一张 24 位图像)。在处理原始图像数据时,总是建议指定一个适当的位深。16 位的 "[-depth](https://imagemagick.org/command-line-options/#depth)" 将产生每个值 2 字节,在这种情况下,你可能还需要指定 "[-endian](https://imagemagick.org/command-line-options/#endian)" 即字节顺序,可以是 'MSB'(最高有效字节在前)或 'LSB'(最低有效字节在前,即默认值)。请注意,rgb 纯粹是图像数据,它甚至不包含图像的宽度和高度!某些应用程序'假定'数据是特定的尺寸,所以你可能需要使用 IM 来确保数据是这个尺寸。例如,这会调整图像大小并填充,以确保它的尺寸为 512x512 像素。

  magick image.jpg -resize \>512x512 \
          -background black -gravity center -extent 512x512 \
          -depth 8  image.rgb

将原始 RGB(或 GRAY)数据读入 ImageMagick 时,你需要指定图像有多大。例如……

  magick -size 512x512 -depth 8 image.rgb    image.png

这将精确定义 ImageMagick 将读入多少数据。有时原始数据可能附带一些额外的头部信息。为了让 IM 跳过这些信息,你可以在 "[-size](https://imagemagick.org/command-line-options/#size)" 设置中指定一个 'byte_offset'。例如,跳过一个 48 字节的头部……

  magick -size 512x512+48 -depth 8 image.rgb    image.png

这是我所知道的 IM 会用到 "[-size](https://imagemagick.org/command-line-options/#size)" 设置中第三个数字的唯一一次。关于使用原始图像数据(灰度)的更多示例,参见 IM 讨论论坛主题 How to convert raw image to compressed tif?

浮点数据

You can also read (and write) RGB using normalized floating point numbers.
This however requires the use of special coder -define settings.
See HDRI floating point file formats
   https://usage.imagemagick.org/basics/#hdri_formats


RGB floating point Image generated using C Code (HDRI)...

   float red = 1.0f;
   float green = 1.0f;   /* appropriate data */
   float blue = 1.0f;

   /* for exach pixel in image... */
   fwrite (&red, sizeof(float), 1, file);
   fwrite (&green, sizeof(float), 1, file);
   fwrite (&blue, sizeof(float), 1, file);

Reading Options....

  magick -size 200x100 -depth 32 -define quantum:format=floating-point
          -define quantum:scale=65536.0   -endian lsb   input.rgb
          output.png

The quantum:format defines to read floating point numbers from the file.
While the -depth defines the floating point size (32 = floats, 64 = doubles).

The quantum:scale  defines how to scale the floating point numbers from
normalized 0.0 to 1.0 values to the in-memory 16bit Quality levels needed
by my Q16 version of IM.