ImageMagick中文使用手册:针对各种图像格式处理用法教程

许多图像文件格式在使用时都有一些需要牢记的特性,这篇介绍了这些特殊需求和如何改善这些格式的结果。

常见图像文件格式小结

读取和写入图像格式的介绍见 Image File Formats,但所有ImageMagick文件格式见 IM Image Formats Page。

以下是最常见的’normal’图像文件格式的快速摘要及其优缺点介绍。

GIF

此格式极其常见,已经存在很久,所有的图像处理程序都了解它。 它仅使用有限数量的颜色(256色表),且只使用8位的质量保存,不过其内置的行程编码使其能够以少量颜色高效的保存图像。

虽然这种格式有透明度,它只知道布尔(开/关)透明度,因此会受’aliasing’ 或 ‘jaggies’影响,将有细线的纯文本保存为透明的GIF图像时所受的影响极为严重。这个问题的唯一解决办法是将GIF图像绑定到将使用它的网页的特定背景。

GIF格式可以存储多个图像来形成动画序列,并为此目的,还可以节省图像画布大小和偏移 (页) 的信息。但是请注意不支持负偏移量,尝试重置偏移量为零。它最适用于只有有限颜色且允许压缩的漫画、线条画和小图标最好用漫画、 线条画,和小图标。但是像较新的格式如PNG可用时,应避免使用这种格式。

JPEG

根本不处理透明度,图像等效于使用”+matte”操作来删除阿尔法通道,因此,任何背景透明度通常变成黑色。

这种格式也是有损耗的,将在锐利的线条和边界上产生边缘效应,因此,不能用于任何中间图像处理或者图像原件的保存(除非它们已经是这种格式)。

它非常适合于现实生活照片的的长期储存,但是如果你打算对图像进一步处理或者图像包含大块的纯色时,应避免使用这种格式。

PNG

这种格式是为了最终取代较旧的如GIF和TIFF格式,它是一个先进的图像格式,能够支持4个颜色通道处理16位质量的图像,并允许使用所有的半透明颜色。它还包括大量的无损图像压缩选项。

其最大的缺点是它比较新,因此Microsoft IE (v6)网页浏览器不能自动地正确处理它,但是这个问题有修补程序可用。

该格式不存储画布大小信息(GIF存储),但是它保存画布偏移量,甚至负偏移量(GIF不保存),然而当使用负的偏移量时,一些网页浏览器存在问题,因此不建议在浏览器中以这种格式的图像作为最后的显示图像。

对于保存中间’layered’图像,保存负偏移量非常重要,往往比不保存画布大小信息重要得多。

MNG

这是用于PNG的多个图像格式,允许动画到电影的质量水平和速度。

需要一个使用MNG的简单例子,如果有,请发邮件给我。

TIFF

这是一种图像交换格式,被用来在任何重要的图像格式可用之前,在程序之间传输高质量的图像。但是,由于这个开端,随意阵列的功能和压缩方式已被修改,没有任何程序可以完全理解这种格式。

这种格式目前几乎只由”Photoshop”在windows平台上使用,这是为TIFF图像格式提供任何标准参考的唯一来源。

TIFF文件可以处理多个图像,除了IM很少有其它应用程序能处理TIFF多图像文件。

通常来讲,除非TIFF图像的内部格式保存相对基本,不能保证由一个程序生成的TIFF文件能被其它程序使用,包括IM甚至是”Photoshop”本身。因此,我不推荐使用TIFF这种格式,建议使用一些别的格式,特别是再图像的长期储存中。

关于该格式的一些注释和问题提供在下面的Miscellaneous Formats, TIFF 部分。这些用法注释可以在IM邮件列表和论坛中发现,因为我自己不使用或需要使用TIFF。

Video Formats

其它电影质量的动画格式通常基于使用有损压缩方式以减少影片的大小和质量。这两种格式都处于一个恒定状态的流量、改进和安全限制功能,从而使得任何形式的处理都变得非常困难。

最近的统计显示,有200多个视频格式解码器,通常用于一个目的或其它。

因此,IM并不直接处理这种格式,而是依靠其它软件包来处理动画的单个帧的出入。这些’delegate’程序包括”mpeg2decode”,”mpeg2encode”和 “mplayer”。

见 MPEG, M2V, and AVI。

GIF图像文件格式

GIF是一个广为人知的图像文件格式,已存在很长时间(从20世纪80年代)。它经常被在网页上显示且包含透明度和图像动画的图像选用,它也几乎是唯一的能被所有的网页浏览器理解的图像格式。

但是除了线条画、数字、图表和卡通片之外,它并不是一个特别好的格式。因为它被限制为最多256种颜色,其中之一通常标记为透明。

标记图像中的一个特定的颜色为透明有一些弊端。如果用来作为透明的颜色选择不当,可能会导致图像的其它并不希望成为透明的部分变成透明的,必须谨慎以确保此不会发生。

更进一步,透明度是布尔值,也就是说要么是完全开启,要么是完全关闭的,半透明的颜色是不可能的,该格式不能提供任何形式的不消除锯齿的图像,通常导致严重的’jaggies’。(见 Anti-Aliasing)

因为GIF图像格式的颜色限制导致这么多问题,特别是在如ImageMagick的高质量图像处理中,我想说在前面:如果可能,尽量避免GIF格式。如果必须使用,作为最后一步使用。

在很长一段时间内,GIF所使用的压缩算法是被授予了专利的,因此,对诸如ImageMagick等的图像处理程序是不可用的,因此,老版本IM程序将输出未经压缩的GIF格式图像,占用更多的磁盘空间。你可以使用GIF分批压缩程序,如”Gifsicle” 或”InterGIF”来修补这个问题。但是该专利保护已经在2004年中期过期了,IM当前版本对GIF图像压缩重新启用了。

图像压缩也是相当简单的,适合用在有大区域的纯的、不变的颜色的图像,或者对相同系列颜色的简单重复模式,比如使用 Ordered Dithering(而不是IM默认的渐变)。

最后,GIF图像可以将多个图像保存到一个文件夹中,这用来被所有的网页浏览器理解的 GIF Animations,尽管这个技巧是由很老的网景浏览器早期版本引入。

总之,GIF图像格式因其有限的颜色表、布尔透明度和过于简单的压缩,适用于如缩略图、特别是卡通图标、标志及有大面积纯色的符号图像。其生成动画的功能,使其成为了生成在所有的网页中可以看到的夺人眼球的标志和广告的理想方法。

对其它的处理而言,因颜色的限制,它是一个比较劣等的图像文件格式,你最好使用JPEG、PNG或视频图像格式来满足需求。

GIF有限的颜色表

未来:色彩还原的例子——参考基本颜色抖动

确保指定的颜色在GIF结果图像中显示

使用颜色表进行色彩还原。

见 Color Quantization.

生成一系列颜色的多个图像的例子见Advanced 3-D Bullet Scripting 。这个技巧也可以用来将图像自动转换到许多不同的背景颜色和图案的多个图像。

GIF透明颜色

例如,在这里我们使用识别来提取透明色和特定的GIF图像文件用来代表透明度的颜色表。Perl脚本只提取感兴趣的区域(可以是多行)。

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


如所见,该图像使用了一个透明的灰色(’#CCCCCC00’),这种颜色在颜色表中业有单独的条目。

你也看到了,尽管图像值使用了5种颜色(一个透明),颜色表使用了8种颜色。这是因为GIF文件格式只能使用2的幂次方大小的颜色表。也就是说颜色表的大小通常是2、4、8、16、32、64、128或者256颜色条目。

因此最后的3个颜色表不会被使用,在一些情况下,这些不使用的条目可能不是颜色表中的最后三个条目,实际上可以包含任何颜色值。你也可是复制颜色值,尽管IM通常会删除这些复制的颜色条目,如果它们以某种方式处理图像。

如IM版本6.2.9-2(和一些更老的版本中),当其读取、处理和写入GIF图像时,IM将保存颜色表,特别是透明颜色值。

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


如你所见,尽管图像被修改了(所有的’wheat’ 颜色像素被替换为’white’ 色),所使用的透明色还是被保留了。但是如果最终的图像没有透明度,颜色表中的透明颜色条目(‘Alpha:’)将被完全删除。

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


如果你想替换GIF文件格式正在使用的透明颜色,你可以使用”-transparent-color”输出设置(添加在IM v6.2.9-2中),例如:

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


如所见,尽管结果和原来的没有明显的不同,透明色被更改为完全透明的’wheat’色。

如果你仔细观察还会看到,图像现在有两个’wheat’ 或 ‘#F5DEB3’颜色在其颜色表中。也就是说,一个透明的小麦色和一个不透明的小麦色。在IM的6.2.9-2版本中,这没有任何问题,尽管只有一个透明色可以被GIF图像格式定义。

为什么要这么做?因为一些非常网页浏览器和图形程序不明白GIF透明度,所以这个选项允许你设置在这种情况下透明区域使用的颜色。

对现代浏览器而言,典型的透明色选择是’white’,或者更典型的是原”mosaic”网页浏览器页面的颜色’grey75’ (‘#BFBFBF’)。其它比较受欢迎的透明色选择是上面的’hand’图像使用的 ‘grey’ (‘#BEBEBE’)和 ‘silver’ 。(‘#C0C0C0’)。这显示了透明色的灰度颜色范围的特定区域是多么受欢迎。

未来:添加链接到颜色选择


在IM v6.2.9-2和”-transparent-color”设置创立之前,IM通常将图像的透明度保存为特殊的颜色’none’(完全透明的黑色),当透明度失效时,它的效果就不是特别好。

注意,”-transparent-color”设置不会添加任何透明度到GIF图像中,或者将特定颜色转换为透明。选项所做的就是指定颜色表中的什么颜色应置于颜色索引中,它是用来代表GIF图像的透明色。

如果你想将一种特定的颜色更改为透明,则使用”-transparent” Color Replacement Operator.

GIF布尔值透明度

因为GIF格式不明白半透明色,而ImageMagick默认生成半透明色作为其常规的Anti-Aliasing Methods的一部分,当你将图像保存为这种格式时,将产生糟透了的外观。

例如,我在一个透明的背景上花了一个简单的黑色圆圈,另外,我将生成图像边缘的放大视图,以显示发生了什么。

首先,我使用PNG格式输出:

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


如你所见,左边画的圆圈的边缘(PNG格式)非常干净(尽管略模糊)。你可以在放大的图像中看到半透明的像素。

现在让我们用GIF图像格式输出相同的图像:

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


图像结果显示,圆形图像的外侧边缘有非常尖锐的阶梯状效果,而圆形的内侧边缘则是合理的抗锯齿效果。 从根本上说,PNG格式可以保存半透明像素信息,GIF则不能。GIF图像格式值能保存单个的纯透明色。换句话说:GIF格式有一个开启/关闭的布尔值透明度

如果更仔细的观察得到的GIF图像,你会发现半透明像素会变成全透明或全不透明。


ImageMagick如何处理半透明像素取决于你所使用的IM的版本。在很长时间内都没有正确定义,且一个版本是如何处理的,取决于用户的错误报告而使用的最后的’bug fix’。

对于ImageMagick v6.2.9-6版本,默认将GIF和XPM图像格式的阀值设定为50%,这已成为图像处理者公认的标准,同时还允许你设置自己的处理GIF文件格式的透明度问题的方法。


由于GIF的限制,在将图像保存为GIF文件格式之前,IM将执行以下操作:

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

如果指定的颜色数少于图像中出现的颜色数,那么其中的-color量化处理将不进行任何操作。如果图像存在有效的色图(使用“+/-map”),它也不会进行任何操作。

它也不尝试使用常见的颜色地图来处理多图像GIF文件,因此如果图像的颜色从一帧到下一帧之间有很大的不同,本地颜色表可能被添加到保存在GIF文件格式中的每个图像。

同样,上面所用的所有设置都不是永久的,而只是要保存的图像的临时设置。也就是说如果使用”-write image.gif”,在处理过程中使用的设置不会影响后来的操作。

你也许想自己做阀值转换,如果不确定所使用的IM的版本这也是被推荐的。

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


上面的示例中在现在IM会自动处理的阿尔法通道上执行相同的”-threshold 50%”,也就是说如果一个像素是多于50%透明度的,将成为全透明的(使用”-transparent-color”给定的颜色)。

然而现在,你可以按照你喜欢的控制阀值。

例如,假设我们想要以大量的 fuzzy semi-transparent shadow 保存图像,例如这个图像(PNG格式):

  convert -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

如果你仅仅将这个字母直接转换为GIF格式,或者甚至使用”-threshold”操作来控制布尔值透明度,你会很失望的。

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


第一张图像通常保存为GIF格式,如你所见,将半透明像素的阈值设置为“50%”,第二张图像的阈值为“75%”,并允许半透明像素成为不透明的。

如果你想删除所有的半透明像素(比如阴影),你可以尝试使用像”-threshold 15%”的操作。

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

大多数其他的关于GIF布尔值透明度问题的解决方法和使用该图像的网页背景颜色有着千丝万缕的联系。用于此操作的方法是复杂且棘手的,现在就让我们来看看。

纯色背景上的GIFs

我们真正想做的是以某种方式保存半透明和反锯齿像素的阴影,且仍然在WWW上很好的显示。要做到这个,有点棘手。

最典型的解决办法是将图像和即将显示图像的背景联系起来。这是简单的事情,只要在图像保存到GIF格式之前,以适当的颜色将图像覆盖到背景上。这删除了任何形式的透明度的需要,整个事情变成了不是问题。当然有限数量的颜色还是一个问题,但是通常不是大问题。

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

看,已经几乎完美了!

当然,要使这种方法正常工作,你需要知道将使用该图像的确切的背景色。当我们完成之后,这个图像不会在任何其它的背景上得以更好地显示。需要做出大的牺牲。

背景图案上的GIFs

但是如果背景使用的是一些图案,而不是简单的纯色呢?

你可以尝试定位覆盖到背景图案的副本,因此,生成的图像中的图案和网页上的图案匹配。但是这需要反复的试验来使背景图像和网页匹配。你也只能保证它只使用于特定的浏览器,且是该浏览器的特定版本。对网页而言,不是一个好主意,不需要费心尝试。我是绝对不会。

不尝试和背景图案进行完美的匹配,而只是覆盖到一个至少与我们打算使用的背景色相匹配的颜色。

例如,让我们的图像覆盖到一个典型的泡沫状背景图案。首先我们需要知道这种背景的平均颜色,发现这种颜色的简单方法是scale 图像到单个像素,然后读取生成的颜色。

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

关于所使用的特殊的”txt:”输出格式的更多信息见IM Pixel Enumeration Text Format 。

现在,让我们使用”-flatten”来设置图像的背景透明度。

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

我已经设置网页在这样的背景下覆盖我们的图像,尽管背景并不是图像本身的一部分。

尽管使用的背景色与背景图案的一般颜色相匹配,还是有一个非常明显的纯色的矩形,在周围没有背景图案。

一种实用的解决方法是申明我们覆盖的颜色,在GIF输出中作为”-transparent” 色。通过这个操作,我们删除了图像的’squareness’。添加一个小的fuzz factor,将改善结果和调整所透明色使用的色空间,以和上面的阀值同样的方式。

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

在大多数的GIF图像的透明度处理中,这已经足够好了,尽管它将图像和一个特定的背景色联系起来。

从本质上来讲,我们使用透明度来设置图像的基本轮廓,而不是真正的透明度。

然而,需谨慎使用”-fuzz”设置,因为太多和你最终得到的不仅仅是你的图像外部变得透明。

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

如果你在图像本身使用一种接近背景色的颜色,也将会失败。因此,这个技巧不推荐用于一般图像,而仅用于特定情形。

为解决这个问题,我们使用’matte floodfill’来设置想要透明的区域。

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

只要图像的边缘没有“leak”,我们就可以与图像内部相似的颜色作为背景色,并且不用将它们转换为透明的,由于“over fuzzing”。

当然,如果我们的图像有小孔,则应特别注意这些小孔,在这种情况下,之前的“fuzzed transparency”可能处理的更好。

说处理GIF透明度很简单?不是的!

另一种处理尖锐锯齿边缘图像的替代技术是使用背景颜色为图像添加一个最小的边框,参考Outline or Halo Transparency。

删除背景色

尝试从一个既有的GIF图像中删除一种特定的背景色并不容易,如果覆盖的图像也含有背景色,将变得尤其困难,因为你将很难分辨什么是背景色什么不是。

最好的解决方法是得到该GIF图像的副本,覆盖到两个不同的且众所周知的背景色上,通过这两个图像,可以完整地恢复原来的覆盖和其所有的半透明像素。

参阅Background Removal using Two Backgrounds。

如果你没有两个这样的图像,则不能完整地恢复图像的半透明,但是有技术可以得到虽不完美但合理的结果。关于此,参阅 Background Removal的其它部分。

非特定背景的GIF(或抖动的透明度)

未来:这将进入一个更一般化的(非GIF特定)阿尔法抖动。

上面的最大问题是,它只会在你恰巧准确地知道你的图像将被使用的背景的颜色或图案的情况下运行。如果你不知道,所有的都将失效。

如上所见,阀值对一个有着大块的透明,比如模糊阴影的图像不能正常运行,但是另一个被称为抖动的技术可以,且不需要将使用该图像的背景的相关信息。

基本上抖动操作将透明色限制为了开/关两种状态,也就是说它将取消半透明颜色。

这种方法的示例在现在被称为”Opossum Examples”中,但是,这些例子并未实际给出用来生成图像的命令,为了完整性,我将在这里演示一遍。

“-monochrome”操作符将图像中所有的颜色转换为一个纯黑和白的”Floyd-Steinberg error correction dither”。但是因为它将灰度图像转换为纯黑和白的颜色,我们需要从图像中提取阿尔法通道蒙版,抖动,然后将其返回到图像。

  convert a.png \( +clone -fx a +matte -monochrome \) \
          -compose CopyOpacity -composite   a_dither.gif

类似的,还有一些其他的抖动操作符,可以通过使用”-channel”设置来限于仅有阿尔法通道(不像”-monochrome”)。

  convert a.png -channel A -ordered-dither   o2x2   a_ordered_2x2.gif
  convert a.png -channel A -ordered-dither   o3x3   a_ordered_3x3.gif
  convert a.png -channel A -ordered-dither   o4x4   a_ordered_4x4.gif
  convert a.png -channel A -ordered-dither  checks  a_halftone_2.gif
  convert a.png -channel A -ordered-dither  h4x4a   a_halftone_4.gif
  convert a.png -channel A -ordered-dither  h6x6a   a_halftone_6.gif
  convert a.png -channel A -ordered-dither  h8x8a   a_halftone_8.gif
  convert a.png -channel A -random-threshold  5x95% a_random_5x95.gif
  convert a.png -channel A -random-threshold  5x70% a_random_5x60.gif
  convert a.png -channel A -random-threshold 50x95% a_random_50x95.gif
  convert a.png -channel A -random-threshold 45x55% a_random_45x55.gif
  convert a.png -channel A -random-threshold 50x50% a_random_50x50.gif











如你所见,”-ordered-dither”生成了一个透明的图案和不透明的颜色来代表所有的透明度,但是这生成了一个有非常明显的规律的图案。不过,如果你使用一个和正常的背景色相似但是比其深的阴影色,将使这个图案变得几乎完全不可见。


“-ordered-dither” 在’half-tone’ 抖动图案中扩充。这个操作符在IM v6.3.0中以命名的抖动图案全面修订了(用”-list threshold”见完整列表)。  你甚至可以生成自己的抖动图案来产生其它的特殊效果。更多信息参阅Ordered Dithering Examples和 Ordered Dither Upgrade notes

在这次重建之前,几何参数只能包含几何字符串’2×2’, ‘3×3’ 和 ‘4×4’(现在仍然有效)。但是其它的都被视为”-random-threshold”参数,通常导致非常糟糕的结果。在IM的老版本中使用这个操作符要慎重。

另一方面,”-random-threshold”产生高度可变的随机抖动,每次运行都不同。这种抖动算法的纯随机特性往往会产生像素大的’clumps’,而不是由”Floyd-Steinberg” “-monochrome”操作生成的平滑、规则放置的抖动。

但是,“-random-threshold”的最大优势就是它提供的限制较少。如果需要使参数非常特定(比如“50×50%”),可以将 “-random-threshold”转换为简单的“-threshold”选项。


“-random-threshold”的参数“PxQ”中,P是最小阀值,Q是最大阀值(要求有百分号’%’),因此“5×95%”意味着任何低于MaxRGB的5%的颜色将被设置为0,而高于95%的将被设置为MaxRGB,否则我们将选择一个介于5%到95%的MaxRGB之间的随机值,作为该像素的阀值水平。“5×95%”的参数是大多数情况下的最好值。

你可以使用一个较暗的中间色调(比如深灰)而非黑色作为阴影色来改善最后的效果。这样做,颜色会更加模糊到背景,使抖动不太明显,如上所示。

如果你大约知道背景色是什么,你甚至可以使用比阴影更暗的颜色来使阴影弯的更好,而不需要限制自己倒特定的背景阴影。两种方法混合使用会使所有的结果有一定改善。

从根本上说,你在你想得到的上投入的越多,结果将更好。

未来:有抖动颜色的抖动示例和此网页的浅蓝色背景匹配。

非ImageMagick的GIF处理

giftrans

列出GIF图像所有的属性和颜色表。它也可以设定一个特定的颜色索引为透明色,而不需要修改图像颜色表的顺序或合并颜色索引来代表相同的颜色(不是推荐的情形)。

IM的”identify”命令可以更好地列出图像属性,包含在图像动画中使用的”Mosaic Application Extension”中的’loop repeat limit’。参阅下面的”gif2anim”脚本,它曾用这个程序从所提取的单个’frames’中提取所需的GIF图像元数据重建GIF。

GIFsicle

这是一个通用的图像优化程序,其初衷是在那个算法还在受版权保护时,重新添加压缩到GIF图像。

这个程序也可用来添加注释,创建GIF动画及和IM的”-deconstruct”相同的方式优化这些动画,尽管需要进一步的透明度优化,比如 LZW Compression Optimization。

InterGIF

和GIFsicle类似的程序,专为处理动态的GIFs,但它仅提供Transparency Compression Optimization,其它一些特征可能也有用,写邮件告诉我你的看法。

gif2anim

一个有GIF动画文件的shell脚本,提取所有的单帧图像,和包含所需的全部IM”convert设置的”.anim”文件,从所提取的帧的图像重建动画。

anim2gif

与上面脚本相反,含有一个包含所有的IM “convert 设置和重建一个GIF动画图像的”.anim”文件。

这个脚本对研究、编辑、调整和合并GIF动画文件非常有用。基本用法参阅Animation Sequence Information,实例见Appending Animations (time synced) 。

GIF图像偏移处理

尽管GIF格式存储图像的偏移量作为其图像动画处理的一部分,它不会保存负的偏移量。任何保存一个负的偏移量到GIF图像的尝试都会导致偏移量被重置为零。这在GIF图像动画设计时,相当痛苦。

如果IE浏览器被给定了一个’page offset’将图像放置在超出了’page canvas size’的地方的GIF图像,它将忽略页面大小和偏移量,以没有偏移量的状态来显示它。

古老的Mozilla网页浏览器则仅仅显示图像画布,将偏移应用到图像。这可能导致显示的是只有空画布而没有图像数据,尽管是正确的,但非所希望的。

两者都将使用页面画布尺寸显示图像,以合适的页面偏移量,如果图像是完整包含在页面画布上的话。

相关的GIF输出格式

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

在”Mozilla”网页浏览器看到这个旧的格式会完全忽略图像的页面几何形状,且不会使用一个更大的页面框,或使用图像偏移。

IM 版本 6.0.4和早期的版本通常会生成GIF89a格式,但是如果图像是一个GIF动画,且使用+adjoin**成单独的图像,IM将使用GIF87a,将导致在网页浏览器上显示的结果是前后不一致的。

IM v6.0.4之后的版本一定生成GIF 89a图像格式文件,除非用户特别要求旧的”GIF87:”输出格式。

JPEG图像文件格式

此格式和上述的 GIF format格式一样常见,但是GIF专为小的简单的”cartoon-like”图像,JPEG则专为有各种不同的颜色和阴影色的大的现实生活的图像,比如照片。

JPEG文件格式的最主要特征是其压缩,减少图像尺寸,同时保持人眼可以接受的图像。这是一个复杂的处理且超出本文的讨论范围。关于这个处理和其效果的更多信息,参阅Jpeg Compression Introduction。

但是,为将图像压缩好,这个算法将有意丢失图像信心,保存的图像和在内存中的图像并不是相同的图像,图像特定像素或区域的颜色通常和保存的颜色不是完全一样的,图像的边缘尤其如此。

警告:

IM是一个普通的光栅图像处理器,用于修改图像。

它不会做无损的JPEG修改。

如果对无损处理感兴趣,参阅 Non-IM JPEG Handling。

通常,JPEG的有损特性并不显著,但是当你加载和保存一个JPEG图像多次,或者使用一个低质量的图形来显示急剧的颜色变化。

然而,只要你不是反复加载或使用JPEG图像(从原始来源保存和应用操作),它仍然是一个不错的文件格式,即使图像类型并不是特别好处理。

作为有损JPEG特性的例子,我生成了一个两个渐变色合并到一起的简单图像。尽管渐变提供了一个JPEG处理的很好的平稳的颜色变化,两个渐变色之间急剧的颜色变化处理的并不好。

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



第一个图像是图像的未失真的GIF格式版本放大的视图。它只包含20种颜色,因此在这种情况下,GIF格式可以很好地处理图像。在另一方面,图像的第二个JPEG版本显示了清晰的JPEG压缩添加到存储的图像的色彩失真。

失真在蓝色通道是最大的,这并不奇怪,因为蓝色不能很好地被人眼分辨。也就是说,人眼会自然地倾向于’spread out’蓝色,JPEG算法利用了这个(通过内部使用YCbCr色彩空间)。实际上,没有上面使用的放大,你可能很难见到效果。

让我们看一看对图像质量的影响。

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






如果仔细观察上面的第一个图像,在这个图像中,我们以’100%’或者最高质量来保存图像,仍然会有少量的颜色失真,很难看到,但是确实存在。

在另一方面,对JPEG图像使用渐小的”-quality”,将使颜色失真更大。不仅是它设置了一系列边缘的’shadowing’产生从锋利的边缘的颜色变化的波的蔓延。

然而,使用压缩的原因是生成的图像的尺寸非常小,至少最初是。以下是生成的图像和以字节为单位的尺寸的文件列表。

注意,GIF图像在这种情况下非常小,因为在GIF中,大的’blocks’或者颜色都压缩的极好。由于JPEG图像质量下降了,图像的尺寸也减小了。当用户或者源图像格式文件没有设置JPEG质量,默认的质量设置大约是92%,这是非常高的质量。

但是使用一个低于’50%’的质量设置,就文件尺寸保存来看图像尺寸不会变的更小,只是一个更逐步降低的图像,这是一个收益递减的过程。

总之:

当保存时,JPEG丢失信息降低图像。

在处理过程中,中间图像使用其它格式。

只在最后图像中使用JPEG格式,不做进一步处理。

JPEG对有着急剧颜色变化的人工图像,比如线图、图表、卡通图标、文本和符号。有少量颜色的这类图像使用如GIF或PNG8的调色板图像格式可以更好地存储。

一个新的JPEG图像格式- Jpeg2000,已经可用了,允许无损JPEG压缩。但是这也要求安装’JasPer’程序库。为使用这个特殊的格式,你也需要使用一个”-compress jpeg2000″选项或者存储为JP2文件格式,所以IM将调用正确的库。

JPEG不存储透明度

除了压缩,JPEG用户面临的其它主要问题是:

JPEG不存储透明度

因此,尽管你可以覆盖图像到一个背景颜色或图案中且存储为JPEG,但不能给JPEG图像一个自由的边界或者透明孔。

因为JPEG专门保存现实世界图像,且不是图像的部分,因此该格式创建时,透明度不是其考虑的问题。因此,设计人员从不担心文件格式中包含一个阿尔法通道或其它透明度信息。

比如,我们拿出上面使用过的带有透明度的PNG,将其直接转换为JPEG。

convert  a.png  a.jpg



如你所见,所有透明的部分变成黑色。但是根据图像来源(特别是GIF图像),透明区域很容易变成其它随机或者不相称的颜色。

如果这是一个问题,最好的主意是在保存图像到JPEG图像文件格式之前让IM Remove Alpha Transparency。

JPEG色彩失真(测试)

如上面提到的,JPEG使用的压缩算法是有损的,图像将被修改来使其压缩的更好,减小文件空间。

究竟有多少色彩失真出现取决于使用的质量设定,比如,让我们看看在IM内置的”netscape:”图像中有多少颜色:

   identify -format "Colors: %k" netscape:

如你所见,这个图像默认在一个大的矩形数组中有216种颜色。这种类型的图像并不是特别适合存储为JPEG图像,正合我们的目的。

所以让我们看一下JPEG图像保存的这个图像生成的颜色数。

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

也就是,在默认情况下,被保存的JPEG文件有差不多9被的颜色。尽管生成的图像将仍然和源图像看起很像,矩形区域的边缘将被添加颜色到附近。

以最高质量设置的保存不会以没有任何色彩失真来保存图像。

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

如你所见,一个高质量设置只会添加一个额外的色赛,但是图像仍然会有轻微的(最小的)色彩失真。你也可以发现,文件大小变大了,因为只能达到非常小的压缩,现在让我们试试”Lossless”:

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

还是有色彩失真!明显的,我的JPEG程序库没有进行无损编码的补丁,但是记住只有另一个有补丁的程序库可以读取这样一个无损的JPG图像。

另一种方法,我推荐汇编你的IM使用JasPer程序库和更新的JP2图像文件格式。

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

如你所见,Jpeg2000格式切换为其它的无损方法的图像压缩,但在默认情况下,不会使图像颜色失真。它也对图像执行一些非常高的压缩方法。

但是对新的JP2格式使用低质量,又将导致色彩失真,以致生成一个较小的图像,就像普通的JPEG图像文件格式。

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

使用JPEG2000编码器的更多信息,参阅JPEG2000 encoding parameter documentation。

读取JPEG控制选项 define jpeg:size={width}x{height}

这个设置是对JPEG图像程序库读取足够的输入(JPEG)图像文件来创建一个至少是给定(宽度×高度)或者更大的尺寸的图像的一个提示信息。

如果输入的图像比较大,这将极大地节省读取图像时IM所需的内存,因为IM将处理一个更小的图像,因此,可以极大地提高完整操作的速度。

记住这只是一个想要的图像尺寸的一个提示信息,但不能保证得到这样的尺寸,只能是比较接近或者比那个尺寸大。通常可以得到这个尺寸和两次该尺寸中间的某个尺寸,同时保留图像的长宽比。

通常在读取了一个有尺寸提示信息的JPEG图像之后,图像将被立即调整为其最后的准确尺寸,通常还使用”-thumbnail”来避开图像配置文件。

比如:

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


在IM v6.5.6-0之前,这个编码设置是从”-size”设置中提取的,这在用户使用”-size”进行图像创建但是之后用JPEG读取会产生意料之外的结果,因此,这被变成了一个特殊的编码设置。

在较老的版本中,你可能需要在读取JPEG图像之前使用”+size 重置”-size”设置,否则IM可能不能读取完整的图像。

注意,这个修改器导致JPEG程序库跳过像素的所有行和列的读取。因此它将产生和 Sampling Resize Operator相似的结果,包括其强大的 Aliasing Artifacts。

因此,建议你至少指定图像最后的’resize’的两倍来避免Aliasing Artifacts,正如在上面的例子中显示的。


注意,在使用常规的调整大小的操作符之前,Thumbnail Resize Operator 也对极大规模的改变大小的操作符使用同样的抽样技巧来迅速减小图像尺寸。

+profile ‘*’

-strip

如被数码相机、扫描软件和其它像”photoshop”等的图像处理软件保存的JPEG图像,通常被添加大的”program comments”配置文件,其中的任何选项都将在图像读取之后,从图像中删除这些配置文件。

“+profile”操作符将从图像中删除所有的色彩配置文件,”-strip”则将删除图像可能含有的所有配置文件和元数据。

注意,”-thumbnail”是一个”-resize”的选项,同时也是一个”-strip”选项。参阅 Creating Thumbnails。

-type TrueColorMatte

因为JPEG不保存任何形式的透明度,当读取它的时候,它通常是全不透明的,在内存中也没有’alpha’或’matte’通道。这个设置将强制所有的JPEG图像都在这个选项有一个全不透明的’matte’通道被添加到内存中的图像之后读取。

更好的进行这个方法则是在读取图像之后,使用一个”-matte” or “-alpha “设置,因为它将对其它图像格式的读取或写入有更小的影响。更多信息见Image Type when Reading and Writing 和 Alpha Set。

写入JPEG控制选项 -quality {percent}

或许是当存储JPEG图像时的更重要的选项,因为它控制在将图像保存到磁盘时,图像压缩多少。值不是一个尺寸百分比,仅仅是一个质量值。值越小,图像越小,丢失更多的图像信息,生成更多的人工产出,降低图像质量。

未来:一张很低质量的照片的例子

注意:一个’100%’的质量设置不能保证没有任何质量损失的存储一个图像,仅仅是一个最小的损失(见下一选项)。

注意:不能通过决定一个质量来得到特定的文件尺寸,除非通过反复试验,以75%的”-quality”开始,检查生成的文件的大小。如果太大了,减少10%的质量,如果太小了,则增加,在你有了质量的上限和下限之后,进行二进制查找来找到一个和你想要的文件尺寸匹配的质量,共有五六次试验就够了。

-define jpeg:extent={size}

在IM v6.5.8-2中,可以指定JPEG图像的最大输出文件尺寸,尺寸以后缀指定,比如”400kb”。

它的工作原理是,生成JPEG图像的多个版本,进行二进制搜索,直到尽可能接近而不超过给定的文件尺寸。通过将 一个图像反复地写入至一个临时文件,一旦有了适当的尺寸,它将立即以给定的输出文件名输出最后的图像。

当将最后的图像输出到一个渠道或者直接到网络,不只是到一个真实文件时,这个输出还是能很好的运行。但是由于I/O要求,不要期望这个处理过程很快,也许会慢4到8倍。

如果你真的进行了时间比较,发邮件告诉我结果。

-compress LossLess

尽管’100%’ 的”-quality”设置,仍然将生产略微不同的颜色(仍然有损),”-compress LossLess”选项将调用JPEG程序库来保存图像,而没有任何数据减少。因此,重新读取图像将会还原保存时的图像。

注意:这只在你的JPEG程序库有’LossLess JPEG’编码补丁的情况下运行,但是JP2文件格式的使用取代了这个,因此这个选项很少有实际效用。

同时,必须设置”-quality 100%”。

尽管凭直觉,你会认为以’LossLess’保存将自动意味着使用100%质量,这是绝对不可能的,这是为图像写入添加一个特别的补丁之后的结果,在定义上就是有损的格式。

当然,生成的文件将远大于正常的JPEG图像。你还会得到一个无损压缩的JPEG图像,除了在一个类似的’patched’JPEG程序库,你不能在任何位置读取这个图像。

因此,’lossless JPEG’并不推荐,而是使用其他的一些格式代替(比如PNG或JP2)。

-interlace Line

使用’Progressive JPEG’样式,将允许图像还在加载的时候,查看大的JPEG图像。以没有进一步的损耗来重新编码一个已有的JPEG图像,同样参阅下面的非IM解决方案。

-sampling-factor {horizontal}x{vertical}

调整JPEG程序库使用的抽样因子来用于色度抽样。这可以设置为’2×1’来创建MPEG-2动画文件。

“2×2, 1×1, 1×1″是IM标准的子抽样方法且相当于4:2:0,参阅Wikipedia, Chroma Sub-Sampling。但是当”quality”时90或者更高的时候,通道将不会被子抽样。基本上,它将定义处理’block’或’cell’的尺寸是8像素或16像素。

-density {Xdpi}x{Ydpi}

尽管密度对生成的图像的输出像素大小没有影响,上面的设置被存储在JPEG图像文件格式的JFIF头中。然而一些像Photoshop的程序将忽略这些设置,如果密度也出现在一个存储在图像中的特殊的photoshop指定的配置文件中(’8BIM’)。

密度只有在如打印机或显示器等输出设备被使用时,才会重要,允许这些设备显示按显示世界尺寸缩放的图像。例如,保证你所浏览的照片或网页以正确的尺寸输出。关于密度的更多信息参阅Image Density Meta-data 和 Resample Resizing。

-define jpeg:preserve-settings

将”-quality”设置为读取JPEG图像时所发现的相同的设置,然而这不会在磁盘上生成相同的文件尺寸,由于读取和重新保存JPEG图像,图像将有进一步的损耗。

这也将重置JPEG程序库所使用的”-sampling-factor”为其内部默认值。

-define jpeg:ptimize-coding=true

开启图像的最佳霍夫曼编码表演算,在默认情况下是关闭的,不过相比于使用默认的编码表,通常优化表只保存几个百分点的最后JPEG文件尺寸,这样的收益的成本是最小的,尤其是再大图像中。

-type TrueColor

IM将自动对只含有一个灰度值的图像使用一个灰阶的内部格式。这个设置将覆盖这个运行,**IM总是输出一个彩色的JPEG图像而非灰阶的。

更多信息参阅 Image Type when Reading and Writing。

JPEG 质量 vs 文件尺寸

给定质量的JPEG文件的最后文件尺寸是不确定的,整个压缩的过程是如此复杂,小的变化将产生非常大的变化,这是混沌理论的蝴蝶效应,它对结果有一个非常强大的影响力。

即使有着同样的质量,但是不同的版本的IM,JPEG程序库,或者其它图像处理程序的相同原始图片,可能会得到在文件尺寸和观测质量有着广泛差异的图像。关于究竟多少压缩或视觉质量应该应用到特定的图像,你也可以将质量设置视为简单的’guess’。

本质上根据给定的图像和质量设置来提前确定最终文件所占的存储空间在现实中是不可能的,除非你已经实际生成了这个文件。

但是IM可以通过使用特殊的’jpeg:extent’定义,进行’test runs’来发现用于一个特定文件尺寸的最佳质量。参阅上面的JPEG Write Controls。这极为缓慢,但是比类似的DIY解决方案快。

通过固定文件大小的方法,一个简单的图像可能以90%的质量出现,但是含有50k不必要的数据,然而复杂的图像将使图像质量降至30%,且展示JPEG的人工产出(或减少技术性的说法,它看起来就像垃圾)。由于目前缺乏细节所需的数据。

最好的办法是找到一个单一质量设置生成一个100KB的平均文件大小,成为你的图像的合理选择,即使没有这么多细节的图像可能只以50K输出,而有着大量复杂细节的图像可能以150k输出,这两者看起来都是可以接受的。

JPEG压缩和质量的实用指南,参阅Optimization of JPEG compression settings。

JPEG内部细节参阅 JPEG Compression, Quality and File Size 。

Photoshop技巧:Photoshop将添加大约4千字节的额外信息至JPEG图像来保存图像预览和颜色管理信息(配置文件’8BIM’)。如果你不想要这些信息,使用’Save for Web’功能,这个技巧发现在Gernot Hoffmann的一篇关于JPEG压缩的文章中。

相关的JPEG输出格式

添加了新内容的最新JPEG格式。

这个格式要求安装了’JasPer jp2’程序库,否则你将得到一个错误:

“no encode delegate for this image format”

这个格式使用小波压缩而非标准的JPEG DCT方法来压缩图像,这对相同的图像质量给定了更好的压缩比,因此将大大地降低所占用的磁盘空间。

但是,它还没有被广泛采用,所以你不能用于外部目的,至少要等到网页浏览器和其它图像浏览器和编辑器也开始使用这个格式。

任何以这个格式保存的图像都只能被用于以这个程序库读取,且大量的用途使用这个程序库还需要很长时间,特别是windows用户,因为微软极有可能包含它,除非足够多的人需要它。

Quicktime技巧:Quicktime使用jp2格式但是必须以”-depth 8″输出。

非ImageMagick JPEG处理(快速小结)

jpegtran 与 JPEG程序库一起安装的标准工具,它允许你对JPEG格式图像运用各种变换,而不需要解码和重编码图像数据,因此,避免JPEG数据退化。(见下)

jpegtrans

之前的”jpegtran”程序的一个较新的版本,尽管许多添加的功能(比如无损裁剪)已经被内置到分布式的程序库版本。

jhead

更方便使用的无损的JPEG处理程序,特别是对于EXIF数码相机配置文件。包括注释的处理、数据调整、缩略图提取、删除或替换、删除配置文件等等。它还试图确保其它配置文件没有被破坏,这往往是”jpegtran”倾向于做的。

还有一些其它类似的程序,比如”ExifTool”和 “Exifer”,许多JPEG至网页照片的相册程序也进行这个处理。


JPEG无损旋转(上面所有提供的)只能正确处理尺寸能被8或16整除的图像。这对大部分(但非所有)的数码相机照片都是正确的,如果你在这个方法中使用了一张尺寸为奇数的图像,那么它右侧或底部边缘部分(包括局部尺寸)将不能正确的放置到最终图像中,因为这些部分只能存在于右侧或底部边缘上。关于此的示例见 specific discussion

如你所见,这些程序中的大多数都被设计用于处理JPEG图像元数据,而不需要重新处理JPEG压缩的图像(见下)。

无损JPEG处理

因为解码和重编码一个JPEG图像导致图像质量的退化(除非使用了无损压缩),JPEG图像程序库提供了许多特殊的可以巧妙地处理图像的程序,而没有质量的损耗。

这些命令也一般远快于IM等效项,因为它们不需对图像进行同样的处理。

修改JPEG图像中的注释时,可以使用较低级别的JPEG程序库程序”rdjpgcom”,”wrjpgcom” 和 “jpegtran”。但是我建议使用”jhead”,因为它保存所有的配置文件和在图像中出现的其它信息。

“jpegtran”允许你进行进一步和真正无损的图像数据处理,包括90度旋转、裁剪和插入。它甚至允许混合质量的JPEG图像的创建。关于此的展示参阅Nemo Thorx的 JPEGhack页。(见下面的注释)

但是这些命令不建议用作一般用途,因为它们局限在图像的块边界(8或16位),这就是说,你可以进行裁剪、旋转或者插入操作在JPEG压缩级别下,而不能是实际的像素级别。

注释:

如果你正在创建JPEG照片的 Montage Thumbnail Web Index Pages ,且想使用添加到JPEG文件的注释,使用上面的程序,在”montage”命令行读取文件名之前,使用”-label ‘%c'”告诉蒙太奇使用’comment’文件。

你也可以在 Complex Polaroid Transformation、Polaroid Montage 或者一些类型的图像Annotation中使用注释。

“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>还指出大多数数码相机(比如他的是佳能1D)在生成的JPEG图像中嵌入了一个大小在12kb-25kb(160×120 pixels)之间的缩略图。

IM可以提取这些缩略图使用:

   convert  image.jpg   thumbnail:thumb.jpg

然而”jhead”程序也可以提取这些缩略图:

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

相较于IM,这超级快,因为它不编辑图像,只是传输现有的数据,但是这些缩略图的质量比不上IM从实际图像中生成的缩略图的质量,且有可能没有被正确旋转,且绝对不会是你想要的尺寸。

使用ExifTool:

来自Rob:如果你想要对存储在JPEG图像文件中的配置文件进行更多的细节编辑,而不是”jhead”所提供的,看看基于perl的更EXIF为中心的应用程序,”ExifTool”,另一种汇编版本”ExifTool”及一个Windows图形用户界面”Exifer”,仅列举这几个。

随着图像::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在加载的同时保存。

混合JPEG质量图像,使用JpegTrans:

Wolfgang Hugemann想要JPEG图像的边缘一点也不压缩,因为它堵塞照片处理。参阅this site。Yuval Levy <imagemagick07_AT_sfina.com>提出的解决方案是使用”jpegtran”来插图一个低质量的JPG至一个高质量的JPEG:

解决方案:

使用ImageMagick生成同一图像的两个版本,一个以高质量100,另一个以低质量60(为了减小尺寸)。

使用jpegtran裁剪q60,在每边去掉8像素。

使用jpegtran将q60合并到q100的顶端。

使用jpegtran合并为一个带状。

Nemo Thorx jpeghack@nemo.house.cx,阅读了上面的,且尝试实施混合JPEG质量,他成功了,且在他的JPEGhack Wiki页上展示了结果。基本上它是可以对无损JPEG格式图像进行处理的,例如在现有图像中对JPEG图像块进行裁剪和插入操作。

PNG图像文件格式

这是最新和最现代化的图像格式之一,支持32位颜色,包括阿尔法通道透明度,但是也可以优化为像8位索引颜色scheme的GIF (256色限制)。

因此它成为了极佳的进行图像处理而不损失图像信息的中间格式。

PNG压缩

当在PNG输出时使用,质量被视为两个十进位的数字,第一个数字(十位)是zlib压缩水平,1-9,但是如果使用了一个’0’设置,将使用Huffman压缩,而非’zlib’压缩,通常会更好!不可思议但是是真实的!

第二个数字是PNG数据编码过滤(在压缩之前),type: 0代表没有,1是”sub”,2是”up”,3是”average”,4是”Paeth”,5是”adaptive”。所以对于纯色序列的图像,”none”过滤器(-quality 00)通常更好,对于自然景观的图像,”adaptive”过滤器(-quality 05)通常更好。


PNG编码器承担了大量的工作,控制精确编码和压缩设置的更好方法通常是使用Define Operator设置。

关于此定义的更多信息参阅下面的Writing PNG Image Controls ,或者查看PNG编码文件中的注释”coder/png.c源代码。

如果你有一个有着二进制(开启/关闭)的透明度的ImageMagick图像,PNG编码器将以一种有效的方式写入,使用tRNS块而不是完全阿尔法通道。但是如果任何非0或MaxRGB的不透明值出现,它将以阿尔法通道写入PNG图像。你可以使用”-type TruecolorMatte”图像读取设置强制这个进程,或者可以使用”PNG32:”格式文件保存图像。

外部的程序”pngcrush”或者较新版本的”OptiPNG”将重新压缩特定的PNG来进行可能的最好压缩,推荐对计划放到网页中的图像使用。另一个程序”pngnq”将颜色量化其到256色、8位PNG,尽管不知道此格式是否支持半透明颜色。

更好的PNG压缩

PNG图像的一个特点是PNG图像将保持全透明像素的颜色,也就是说,尽管你看不到透明度有颜色,PNG保存颜色数据。

这意味着在许多情况下,通过以一个稳定的纯色,而非可能由前面的图像处理遗留下来的垃圾色来替换’invisible color’,PNG可以被压缩的更好。

有两种主要方法可以用于此,使用 Alpha Background Operator 仅处理全透明的像素,或使用Fuzz Factor with Transparency 类型选项来映射近乎半透明的颜色至全透明的黑色。

例如,在这里,我们对上面生成的”a.png”采取模糊阴影,且替换所有全透明度在20%以内的像素。

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



如你所见,你可以得到图像尺寸(50%左右)的大幅改善,但是图像的阴影有一个锐截止。

另一种方法是减少阴影效果,通过调整透明度通道的Levels。

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


你也可以通过使用较少数量的颜色来改善压缩算法的结果,因而最终PNG图像的尺寸。

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

但是这些只推荐适用于不包含透明度的小的缩略图,且只作为最后的一步,因为它是一个非常’lossy’的方法。

PNG,网页浏览器和透明度

当包含任何形式的透明度时,微软的IE浏览器(IE6和之前的版本)不能正确的显示PNG图像。目前虽然它是不完全支持PNG的最众所周知的浏览器,但并不是唯一的一个。PNG transparency test 和 Another PNG test 页将允许你测试你的浏览器,它们也列出生成所显示结果的浏览器和版本。

然而由于IE(至少在写作时)是最常用得到浏览器,你可以在你的网页上添加一些围绕这个问题的操作。关于此的信息见我的WWW实验室页 PNG with Transparency and IE,在其中我测试和展示了我所使用的”PNG in IE”的解决方案。

其它解决方案都是转换PNG至JPEG(以正确的颜色背景)或者GIF格式。这些方法在GIF Images on Backgrounds中详细地讨论了。

另一种解决方案是在将图像保存至PNG之前,在图像中设置所有全透明度颜色的颜色。PNG将保存全透明度的颜色,但是注意几乎任何其它的IM操作将重置全透明背面至全透明的黑色(因为透明色在这种图像算法操作方法中并不会产生什么影响)

例如,标准的 IM examples test image对任何全透明的像素使用全透明的黑色,我们可以通过关闭阿尔法通道或者将其保存为JPEG来检验:

convert test.png test.jpg

现在让我们将这保存以致所有的全透明颜色被全透明的’silver’色替换(参阅Alpha Background操作符):

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

注意,图像仍然看起来是正确的,如果透明度(或页面上的特殊JAVA script)在你的浏览器上运行。

但是如果我们关闭阿尔法通道(通过存储为不允许阿尔法的JPEG),会发现PNG确实在全透明像素中使用了’silver’色。

  convert test_silver.png test_silver.jpg

注意,但是这不修改半透明像素,且仍然会有正常色(非透明的),而没有将该色和页面背景混合,或用于全透明。

因为不再包含半透明度,边界看起来是锯齿状的,在淡颜色的边缘也会有’halo’效应,例如,你仔细观察黑色和白色圆圈的边缘,上面有一些难看的锯齿状效果,但是使用一个灰色的替代颜色将使其不会比用于全透明的原始’black’颜色糟糕。

设置全透明像素的颜色的另一好处是改善数据压缩。有时,在处理过程中使用的透明区域的颜色被保留了,这将使其压缩没有纯色压缩的好,因此按照上述的来设置全透明颜色,可以节省最终文件的尺寸。

但是这作为最后一步来运行,因为许多IM图像处理选项将替换所有的在图像背景中出现的全透明颜色为全透明黑色,已知的可以进行这个处理的操作符列表见Alpha Background操作符。

对于PNG显示的问题,我的倾向是,微软修改IE,似乎IE版本7终将在所有情况下,对PNG透明度进行全部处理。

PNG和虚拟画布

虽然PNG一般不会保存虚拟画布尺寸信息,但它保存虚拟画布偏移量信息,且如果出现的时候,IM将尝试生成适合于那个偏移量和图像尺寸的’canvas size’。对于一些如”-crop”, “-trim” 和”-flatten”等的使用图像画布或页面尺寸作为其操作或结果的一部分的图像操作符来说,记住这个非常重要。

当然,你可以使用”-page”设置和”-repage”操作符,来设置或删除虚拟画布尺寸和偏移量。(参阅Page Image Attribute)。比如第二个”convert”看见了出现在PNG图像中的偏移量,定义了一个足够大的画布来确保图像是在虚拟画布边界内可见的(添加至IM v6.1.7)。

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

然而,尽管PNG格式通常不会保存画布尺寸信息,IM添加了一些虚拟画布尺寸至PNG图像中。但是这个数据只能被IM命令使用,而通常被其它PNG图像格式读出器忽略。

比如,第二个”convert”命令确实看见了一些虚拟画布尺寸信息:

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

如果PNG图像是由一些非IM程序处理的,这个画布尺寸元数据将可能丢失。记住,画布尺寸信息通常不是PNG图像文件格式的一部分。

要注意的另一件事情是,’offset’信息可以有负偏移量(不像GIF格式),IM将适当地处理这些,使这个格式适用于存储中间Layer Images。


一些网页浏览器不能很好地处理负偏移量,产生奇怪的结果(firefox的一个版本有这个问题),最好是避开可能被其它程序如网页浏览器使用的图像中含有负偏移量。

PNG分辨率、密度和单位

经过一些测试,似乎PNG图像文件格式不支持’PixelsPerInch’的”-units”设置,只有’undefined’ 和 ‘PixelsPerCentimeter’。

因此,IM转换给定的密度/单位设置为’PixelsPerCentimeter’适当的值。

PNG输出格式

PNG8: 相当于GIF,包括布尔透明度和256色限制。

PNG24: 8位RGB,没有阿尔法通道(和JPEG有点像)。

PNG32: 强制一个有半透明颜色的全RGBA图像格式。

如果给定的是一个普通的PNG,IM将使用上面的最节约空间的样式。


PNG8是由PhotoShop而非PNG组群定义的,尽管它可以处理多个半透明色和全透明色,但IM假设其不能。这提供了一种强制文件仍然能够被IE6读取的方法,”Photoshop CS”程序可以读取它。

你可以强制IM创建一个图像颜色索引表(或调色板),然后IM将使用”PNG8:”格式存储图像。

  convert {input_image}  -type Palette  indexed.png

强制使用一个单个8位灰阶通道,而不是一个调色板索引,使用:

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

你也可以以透明通道输出灰阶图像(在IM v6.3.5-9中添加)。

  convert {input_image}  -type GrayscaleMatte  gray_with_transparency.png

对一个简单的两种颜色的图像:

  convert {input_image}  -type BiLevel  bitmap.png

更多信息参阅Image Type I/O Setting。

写入PNG图像控件

为了更好地控制PNG图像的写入,在IM v6.5.2中,Glenn Randers-Pehrson修订了若干编码器”Define Global Setting”控件,这些包括:

-depth {depth}

要生成的图像一般深度通常设置为8或16位。

-define png:bit-depth {depth}

精确地指定生成的PNG图像文件格式的深度,这覆盖常规的IM”-depth”空间,但是专为写入OPN图像,且只当变化不会产生损失时。在颜色映射图像的情况下,这是颜色映射索引的深度,而不是颜色样本的。

-define png:color-type={type}

精确地指定写入的PNG文件的类型,值可以为:

‘0’ for Greyscale, which allows for ‘bit-depths’ of 2, 3, 4, 8 or 16.

‘2’ for RGB, which allows for ‘bit-depths’ of 8 or 16.

‘3’ for Indexed, which allows for ‘bit-depths’ of 1, 2, 4 or 8.

‘4’ for Gray-Matte

‘6’ for RGB-Matte

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

从{file}的{x}位置添加一个原始的PNG配置文件,{file}的前四个字节包含数据块的名称,后面跟一个冒号’:’,然后是块数据。

{x}可以是在PLTE前放置的’b’,’m’在PLTE 和IDAT之间,’e’在IDAT之后,如果你想写入同类型的多个数据块,则在{x}之后添加一个短的独特的字符串,来防止后来的配置文件覆盖之前的配置文件。

比如:

  -profile PNG-chunk-b01:file01 -profile PNG-chunk-b02:file02
+set date:create
+set date:modify
+set date:'*'

一般地,如果你想将同一图像写入两个独立的PNG文件,这两个文件比较起来将不会相同。这是因为IM也将在文件中存储图像创建信息,JPEG图像没有这个问题,但是它们是有损的,比如:

  convert logo: logo.jpg
  convert logo.jpg logo1.png
  sleep 2; touch logo.jpg
  convert logo.jpg logo2.png
  diff -s logo1.png logo2.png
  compare -metric RMSE logo1.png logo2.png null:

上面的”diff’将会返回消息:

“Binary files logo1.png and logo2.png differ”

即使”compare”返回至意味着图像有着完全相同的图像数据的”0 (0)”。

解决方案是以没有任何’time stamps’保存图像,你可以各个地删除时间戳,或者使用’date:*设置删除所有的时间戳。但注意,你可能需要转义’*’。

比如:

  convert logo: logo.jpg
  convert logo.jpg +set date:\* logo1.png
  sleep 2; touch logo.jpg
  convert logo.jpg +set date:\* logo2.png
  diff -s logo1.png logo2.png

这次”diff”报告:

“Files logo1.png and logo2.png are identical”

旁白:你也可以使用”cmp”、”md5sum”或 “sha1sum”程序来比较二进制图像文件。

非ImageMagick PNG处理

有许多PNG的辅助应用程序,可能是生成最终的PNG图像文件的有用的辅助程序。

pngtrans 在图像中存储的PNG信息。

pngcrush

在对每个图像做出最终选择之前,通过尝试使用所有可用的逻辑PNG压缩,来找出PNG的最好压缩。这将在每个图像上花费一定时间。

OptiPNG

一个较新的PNG压缩优化程序。

pngquant

有损的PNG优化程序,将PNG图像减少为有抖动的8位颜色调色板。将生成在tRNS块中有阿尔法通道的颜色索引PNG。

pngnq

一个较新的有损PNG量化器,生产8位颜色表PNG图像,也强制使用调色板。

pngout

一个Windows平台的PNG优化程序(有可选择的GUI),使用优化空间而非速度的ZIP压缩器(也在上面的链接的页面)。

大多数都用来改善图像文件的最终尺寸,通过有损或无损方法。

PNG – JPEG分层图片

通过将大的报纸或杂志页分离,文本层存储为PNG,图像层存储为JPG,都使用白色背景,有可能比合并到一起需要更少的磁盘空间。

更重要的是图像可以使用有损压缩(JPEG),文本部分仍保持清晰(PNG)。

这听起来愚蠢且怪异,但是这是真的,分开的图像比单个的合并的图像要节省3到4倍的磁盘空间。

通常,这两个图像都在发布过程中作为单独的层生成,但是你可以分开这两个图像,它们仅仅叠加到一起。

  convert  ny_family.jpg ny_family.png -composite   ny_family_merged.jpg

选择所生成的图像查看更大的副本

这使用了普通的Over Composition,要求PNG图像是透明的,这种透明度来自两种形式,其中之一是布尔(开/关)蒙版,就像在上面看到的。

布尔蒙版通常使用图像蒙版方法,在实际图像后创建两个图层。结果是任何覆盖实际图像的文本层项,可能包含下面图像的一些像素,

但是发布软件则能创建完全作为两个条目的两层。在此情况下,蒙版将包含文本消除锯齿边框的大部分。文本仍然保持纯色,因此可压缩的很好。还有一个好处是图像层可以没有任何实际问题地被替代,即使文本覆盖了背景图像。

目前的网页浏览器甚至可以在屏幕上进行上面的覆盖(使用CSS格式控制),因此即使网络带宽也可以通过作为单独的条目发送而节省。

覆盖的另一种方法是采取非布尔值文本层,然后’flatten’ (Remove Transparency)它到一个白色背景上,这简化了PNG,使其压缩得更好。如果使用的是白底黑字文本,PNG可以使用灰度索引图像(几乎像GIF)可以比彩色图像压缩的更好。

这样的一个’black on white’图像可以使用 Multiply Composition来覆盖到你的JPEG’image layer’,它将白色区域当做透明处理。

黑色文本和黑色线条画可以没有任何问题地覆盖图像,但是非黑色覆盖彩色图像可能会出现颜色失真,这就是此方法的限制及通常不使用的原因。

同样参阅IM论坛讨论Extracting Text Layer from PDF

图像配置文件

照片质量图像中处理配置文件是非常重要的,但是在我看来这是一个非常神奇的艺术,而不是简单的事。

并不是所有的格式使用配置文件,但是大多数现代的格式使用,包括JPEG,PNG,TIFF和GIF。

实际上,使问题更加严重的是:许多程序甚至不理解或查找图像中的颜色配置文件。 Alan Gibson, aka Snibgo在他的 Snibgo, ImageMagick Profiles页上,汇集了各种浏览器是如何处理各种颜色配置文件的,这值得一看。

列出图像中出现的配置文件,使用:

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

常用配置文件包括:

EXIF Digital Camera Meta-Data

ICC Image Color Space Profile

ICM Microsoft Color Management (like ICC)

IPTC Image and Author Info

8BIM Photoshop 元数据配置文件,包含剪辑路径等数据。还有什么?

XMP Adobe的可扩展元数据平台(XMP)(参阅adobe page)

你可是使用IM为此目的提供的特殊输出格式来提取这些常用的配置文件。

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

上面的”-define”选项是作为JPEG程序库的’hint’,来减少需要读取到内存的实际图像数据的数量,然后保存大量的对实际不需要的数据的处理。

你也可以插入或者重新插入一个任意的配置文件作为一个’blob’二进制字符串,包含你所想要的任何信息。

  -profile ‘profile_name:data_file’

这就是文件”data_file”被添加’as is’到图像中作为配置文件名。IM或者其它应用程序会忽略这样的配置文件,除非明确的知道它。

颜色配置文件的基本知识

第一句:

Color Management is for Wimps – 不要跟它们玩

玩弄配置文件将使事情更糟

因此,如果颜色看起不错…不要管它。

在IM论坛中的一个用户fhoech (现在他已经消失了),多次贴出以下关于使用色彩配置文件来改变图像所用的颜色空间的基本介绍。

RGB,sRGB 和 CMYK都不是色彩空间,它们是色系(IM使用”-colorspace”操作符控制)。没有单个的RGB或CMYK色彩空间,但是每个色系中从字面上可能有无限的不同色彩空间。

你需要准确描述图像颜色的ICC(或ICM)配置文件,一般地,描述图像的ICC配置文件应该嵌入图像本身,否则,你需要尝试使用’best guess’:打开ICC-capable图像编辑器中的图像,指定不同的ICC配置文件(不要转换),直到找到在你的图像中看起来不错的那个(必须校准监视器来得到较好的色彩预览),然后将图像和嵌入的配置文件一起保存。

关于为什么你需要两个配置文件:源配置文件描述了图像中现在的颜色。目标配置文件描述在转换之后输出图像中的颜色。

当转换为给定的目标配置文件时,应该非常谨慎。例如,如果你使用一个配置文件,它定义了绘制到未刷漆股票中的偏移量,但你打算将图像打印到铜版纸上,那当然不会得到任何好的结果。输出的配置文件须准确表现你预期的输出状况。

当从负转换为正的色彩空间时,没有使用正确的配置文件(转换的两部都没有),在大多数情况下,你将不会得到正确的颜色或亮度,虽然你可能很幸运且碰巧达到了目标。

你可以从 International Color Consortium下载色彩配置文件。

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

虽然你可以像这样直接地转换色彩空间:

convert cmyk_image.jpg -colorspace rgb rgb_image.jpg

将CMYK转换为RGB JPEG的最好办法是使用有”-profile”操作符的色彩配置文件。

Raf Lenaerts指出了下面的在ImageMagick中使用”-profile”操作符的规则:

如果没有嵌入的配置文件,则第一个”-profile”是输入配置文件,第二个”-profile”则定义了输出配置文件。

如果有嵌入的配置文件,则单个的”-profile”操作符将立即定义输出配置文件。

总之:

“-profile”必须放置在输入和输出文件之间,这是标准的IM Command Line Processing Practice.

使用带有’icm’的”+profile”将删除出现的icc-配置文件。

给定的第一个”-profile”是输入配置文件。

给定的第二个”-profile”是输出配置文件。

因此对所有的图像使用配置文件,你需要3个”-profile”操作符:删除、输入和输出配置文件选项。

例如,如果输入图像已经有了一个色彩配置文件,则只需要一个。

  convert rgb_image.jpg -profile USCoat.icm cmyk_image.jpg

但是如果图像没有(或者你知道它是一个RGB图像,但是没有配置文件),你可以使用:

    convert rgb_image.jpg +profile icm \
            -profile sRGB.icc  -profile USCoat.icm cmyk_image.jpg

这将设置生成的图像问CMYK USCoat.icm配置文件,另一个CMYK配置文件是SWOP.icm。

反之(图像已经有了一个配置文件)使用:

convert cmyk_image.jpg -profile sRGB.icc rgb_image.jpg

警告:

如果源图像已经有了一个配置文件,比如一个CMYK配置文件,则给出两个配置文件的转换是一个坏主意。

比如:

    convert cmyk_image.jpg -profile "CMYK.icc" -profile "RGB.icc" \
                  output_image.jpg

将导致一个CMYK -> CMYK -> RGB的转换,但是因为CMYK不是对称的,额外的转换步骤将导致灾难性的颜色转换(参阅IM论坛讨论Question on ICC profile conversion behaviour)

色彩配置文件修改

你所想转换的图像应该都含有嵌入的ICC配置文件,因此使用一个相同的CMYK ICC配置文件来转换图像。

  convert rgb_image.jpg -profile CMYK_PROFILE cmyk_image.jpg

在默认情况下,这将使用感知意图进行转换(关于转换方式的详细解释参阅Color Space Conversion )。因为通过感知意图生成的结果根据用来创建ICC配置文件的软件会有很大的不同,你可以使用”-black-point-compensation” 和 “-intent relative”来生成多少和想要的图像接近的图像。

  convert rgb_image.jpg  -intent relative -black-point-compensation \
          -profile CMYK_PROFILE     cmyk_image.jpg


“-black-point-compensation” 选项已添加到IM v6.2.7-0中。

你可以从 International Color Consortium中下载色彩配置文件。

EXIF InterColorProfile

除了上面的色彩配置文件处理,许多数码相机,以EXIF配置文件属性’InterColorProfile’保存色彩配置文件信息。该属性是假设没有嵌入色彩配置文件,根据文件”Colour Management and Adobe PhotoShop 7″。

IPTC 配置文件

IPTC配置文件在图像中用来存储图像的识别属性,比如标题、作者、关键词等。

如果你想在图像中添加一个IPTC配置文件,你需要单个配置文件:

convert image.jpg -profile iptc iptc_image.jpg

如果图像包含一个配置文件,你可以以此存储它,因此你可以添加该配置文件到其它类似的图像:

convert iptc_image.jpg iptcData.iptc

或者你可以提取一个配置文件的文本版本,你可以编辑:

convert iptc_image.jpg IPTCTEXT:iptcData.pro

这里是在IM论坛由fcaserio 提供的一个配置文件的例子。

你可以添加此配置文件到一个图像使用:

  convert image.jpg +profile 8BIM -profile 8BIMTEXT:iptcData.pro \
          iptc_image.jpg

这个图像可以转换为带有TIFF 预览 (EPT)的EPS (Encapsulated Postscript),也包含IPTC配置文件。(感谢 Tee Tanne)。

 convert itpc_image.jpg  EPT:image.eps

XMP 配置文件

从TIF图像中提取一个XMP配置文件:

  convert picture.tif metadata.xmp

关于矢量图像格式

在这个世界上,图像存储的方式不止一种:

Raster 使用彩色像素阵列存储和处理图像,光栅图像格式包括GIF、PNG、JPEG、TIFF等等。图像可以由多个代表不同颜色的阵列(通道)组成,且一个图像格式文件可以有多个图像、层或者帧。

Vector 图像以线、厚度、拼贴、渐变和其它复合物定义,格式包括SVG, Postscript、 PDF、FIG、DXF、WMF、甚至 TTF 字体,它允许图像被修改,甚至大幅度放大而没有质量损耗。此外,编辑该格式同时,你可以移动整个图像而不会破坏下面的图层。

Fractal 在特殊的情况下,用来对复杂的图像进行极端压缩,比如旧的油画。但是我所知道的唯一用途是用于一个非常昂贵的商品,除了那个用途,它也用于复杂的数学对象,比如Mandelbrot 和 Julia sets,和生成屏幕保护(IFS)中的随机颜色,非常少见。

为什么这个非常重要,因为IM是一个’raster image processor’,同时它可以读取或写入以其中的一个矢量格式存储的图像,通过转换图像到内部光栅图像,或者从内部光栅图像转换图像。

因此,如果你想将一个图像从一种矢量格式转换为另一种矢量格式,IM将以当前定义的 resolution or density栅格化这个图像,这将有希望适合于你想使用这个图像的输出设备。

换句话说,任何来自IM的输出永远都不是真正的矢量格式,尽管它能将其内部的光栅格式转换为矢量格式文件,生成的图像只是一个表面由矢量图包装的光栅格式图。并且除非光栅图定义的适合于输出设备,生成的图像并不特别好。

不幸的是, IM的新用户并不知道这一起。它们将IM视为一个转换器,可以把PostScript转换为PDF格式,生成的图像在输出设备上会出现块状锯齿效果、褪去的颜色或难看的模糊图像。

避免使用ImageMagick进行“矢量图”到“矢量图”的转换

例如:在PDF、PS、SVG格式之间转换

换句话说,就是要使用正确的工具来完成正确的工作。但对于这种情况,ImageMagick就不是正确的工具。

这并不是说IM不能被用来完成这样的转换。毕竟大多数的打印机和显示器实际上本身会对图像进行栅格化处理,然后再打印到纸张上。不同的是,打印机知道它使用的硬件需要的分辨率,而ImageMagick就不知道了。

如果需要了解将矢量图像转换为栅格图像的例子(和改进这种转换),请参看Postscript/PDF pre-formatted Text and Graphics Input,SVG和用户生成的矢量图像参见SVG Image Handling。

你还可以在Font Size, Resolution and Pointsize中找到有用的信息,特别是绘制文本字体时关于“-density”选项的效果。

非IM替代方案

如果你确实需要在矢量格式之间进行转换操作,可以采用UniConvertor、Sk1 Project(通常是作为一个标准的Linux软件包)和VectorSection方案,它们可用于实现矢量图像之间的转换而不用对图像进行实际栅格化处理。

如果进行普通的postscript到其它矢量格式的转换,可以参看“pstoedit”,通常包含在你的系统额外套件库中。也可以参看“epstopdf”,它是Comprehensive TeX Network (CTAN)的一部分。TeX和LaTeX是UNIX文档(书籍和科技文献)文字处理系统。有许多这样的工具可以处理PostScript和PDF格式。

如果进行PDF到SVG的转换,Wolfgang Hugemann Auto@hugemann.de建议最简单的矢量图像之间的转换,就是将SVG显示在浏览器(Firefox)中,然后使用PDF打印机驱动程序将它打印处理。虽然你也可以使用“Uniconvertor”。

其它图像文件格式

当然还有数量非常庞大的其它图像文件格式在IM中也可以使用和支持,但是使用这些并不常用的格式许多是专门为了实现某些特定的目标,并往往需要一些调整或其它选项来让它们达到你希望的效果。

我不推荐使用这些文件格式,一般我也不会使用它们。不过,我确实努力记录下了IM邮件列表和IM论坛中反馈的各种注意事项、技术和选项,这样大家都可以使用这些收集的信息了。

许多注意事项都保持了原来未加工的形式,我愿意继续接受并记录大家的贡献,然后重新写入下面的说明中。

Postscript(PS、EPS)和Adobe PDF

基本处理方法请参考Postscript Text Handling以及有关矢量图像格式的警告。

PostScript和其它相关格式(如PDF)的主要问题是它是一种复杂的页面格式语言。这种格式其是一个程序,而不是真正的图像格式!这意味着IM必须依赖其它的外部程序来运行它,并返回生成的图像。

封装Postscript(EPS)

封装Postscript实际上和正常Postscript(矢量图像格式)完全相同,除了它是单页的图像,并且采用“边框”选项来定义了图像封面的确切区域。

这个格式的设计初衷是为了允许其它程序移动和缩放的图像,当把它定义的Postscript插入到其它的Postscript文件中时。

IM基本上和Postscript采用相同的方法来处理它(见上文)。

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

使用“EPS2:”或“EPS3:”来创建JPEG压缩的EPS文件。注意,添加配置文件到EPS图像中的操作是在“将要实现”的名单上,但目前并不支持。

Postscript/PDF输入

由于这种格式是一种矢量图像格式,因此它会受到例如“-page”和“-density”设置的影响。

Postscript Formatted Text中提供了读取Postscript的例子(这对于EPS和PDF格式也是相同的),并且你应该首先阅读它。

然而,读取这些格式是非常复杂的,因为它们都是专门设计出来用于为高品质的激光打印机产生打印页面的计算机语言。这远远超出了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系统登录。想了解更多信息,请参看这个博客this blog。

特别的PDF读取选项

PDF处理的特殊选项

-units PixelsPerInch

处理PDF文件时(阅读或创作)应该设置它。我并不知道它会做什么,但反馈报告表明应该设置这个选项以完成正确的工作。

-define pdf:use-cropbox=true

对每张Adobe生成的PDF文件使用“cropbox”而不是默认的“mediabox”(基本上对ghostscript的PDF图像转换需要添加“dUseCropBox”)。

注:如果你的PDF只有一个页面,然而它又是多页的PDF格式,它将不会被正确的裁剪。

-define pdf:use-trimbox=true

对每张Adobe生成的PDF文件使用“trimbox”而不是默认的“mediabox”

修改输入外接程序

修改系统的外接程序是非常危险的,任何错误都可能导致IM无法读取PostScript/PDF文件。你可能还需要具有管理员权限,因为由于安全(黑客)设置,你不能使用用户权限来修改系统定义的外接程序。

参看Delegates and Coders for Image Formats获得更多XML语法和意义的信息,并创建自定义的输入/输出外接程序。

论坛上的Convert EPS to JPG Unreliable主题中,有人建议可以编辑系统的“delegates.xml”文件,来将“-sDEVICE=bmpsep8”替换为“-sDEVICE=bmp16”。其它用户还发现,如果将它改变为“-sDEVICE=pnmraw”,效果会更好。我自己并没有尝试过,所以不能确保它的正确性,或者告诉你什么版本的Ghostscript可以适用。如果你有任何更进一步的信息,请告诉我们。

如果你有一个CMYK postscript或PDF文件,那么约翰的博客(Blog of John)中详细介绍了你可以如何修改外接程序(新增“-dUseCIEColor”ghostscript选项)。

另一种可能的方法是,创建一个用户的外接程序来调用pdftoppm。也就是说,被称为“pdfalt”的标签将会从“xpdf”包中调用程序“pdftoppm”,甚至是“pdfimage”。

然后你的数据流将会看起来像这样:

convert pdfalt:image.pdf image.png

有人想尝试创建一个外接程序吗?请告诉我们!

你可能也想尝试使用“pstoedit”,它可以将Postscript文件转换为其它的矢量格式,或把Postscript传递到ImageMagick API中,并将它转换成位图。我没有对此进行实验或测试,希望能得到一些反馈。

其它读取PDF的解决方案

在IM论坛讨论得到的另一项建议是,使用商业的窗口化包PDF to Image Converter。

解决方案包括:

用“pstoedit”转换到其它矢量格式,例如SVG。

“ghostscript”包中的“pdftoppm”。

“xpdf”包中的“pdfimage”。

Wolfgang Hugemann提出的另一种可能就是直接提取出图像包含到PDF文件中(特别是从PDF格式的扫描仪产生的)。基本上是通过提取出“stream”和“endstream”之间的任何字节序列,并保存为一个单独的文件。

一般情况下它的效果如何仍有待观察。但是这种方法具有明显的优势,因为它采用了它们的自然分辨率来提取图像,没有进行任何缩放或扭曲操作。

Postscript/PDF输出的替代方案

如果你更感兴趣的是PDF文件中包含的实际图像,那么你可以研究一下“pdfimages”程序,它是“poppler-utils”或“xpdf-utils”软件包中的一部分。这些软件包还包含了许多其它工具,对PDF处理也很有帮助。

也许有人想使用这些软件包编写一个ImageMagick的外接程序?

旁白:如果你想要的是实际文本而不是这些图像,那么“pdftohtml”程序将有一个XML输出,Ross Presser报告说“它非常擅长重组段落”。但是,你也可以使用ghostscript程序“ps2ascii”或“pstotext”。

同时“pdftk”程序可以解压一个PDF文件,因此它可以被直接编辑,并且修复损坏的PDF文件。

Postscript/PDF输出选项

我们知道以下设置将影响PostScript、封装PostScript和PDF图像格式的输出:“-page”、“-gravity”、“-compress”、“-density”。

默认情况下,PDF图像输出采用无压缩方式,所以PDF文件往往是比我们需要的大很多。下表列出了IM中的压缩模式和与之相同的PostScript压缩模式。

PS/ PDF格式压缩的意义

Compression image '/Filter [ ... ]' setting
"-compress none" '/ASCII85Decode'
"-compress zip" '/FlateDecode'
"-compress jpeg" '/DCTDecode'
"-compress lzw" '/LZWDecode'
"-alpha off -monochrome -compress fax"  '/CCITTFaxDecode'
"+compress" 
"-compress rle" 
    any thing else '/RunLengthDecode'

PDF中推荐的压缩格式是Zip(Deflate Compression)或者Group4(Fax)压缩格式。

  convert image.gif -alpha off -monochrome -compress Zip -quality 100 \
          -units PixelsPerInch -density 600  image_deflate.pdf
  convert 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) 不能,但将Perl脚本sam2p_pdf_scale.pl和sam2p结合起来,可以对sam2p创建的文件进行再处理。例如,缩放并将PDF在A4纸上居中,例如:

sam2p input.img output.pdf
sam2p_pdf_scale.pl 595 842 output.pdf

不幸的是,它并不会对IM创建的默认PDF起作用。

多页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。

#!/bin/bash
  for x in ./*.jpeg
  do
      echo $x to ${x}.pdf
      convert $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 None”设置)。 IM当然可以读取其中任何一种格式。

NetPBM格式通常每个文件只保存一张图像。但是,IM和许多其它的NetPBM工具可以读写多图像的文件,通过简单地将它们合并在一起。因此,在将图像写入文件时,设置适当的“-/+adjoin”选项可能是一个好主意。(参看Writing Multiple Image Sequences获得更多信息)。

PPM文件格式实际上对ImageMagick是非常重要的,因为它是Postscript和PDF图像通过“ghostscript”外接程序进行转换操作过程中的通讯格式。同时,它还是视频图像处理的主要格式,例如“ffmpeg”命令。

任何质量或值的范围都可用于输入(16位或65535“深度”)。例如这里使用了不同寻常的5作为值的范围,来产生一个“步状梯度”。据我所知,还没有其它的图像格式可以运行你使用这样一个奇怪的质量范围。

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

也可以参看Resized Gradients,介绍了使用NetPBM文字图片来创建非常小(2或者4像素)的图像。

上面还演示了ASCII格式可以是多么有用。 特别是作为一个将图像添加到shell脚本中的方法,或者用数字数组生成图像的一种手段。

这种用法的一个例子可以在Histogram Redistribution Methodology中看到。

PbmPlus/NetPBM与ASCII数据格式

ASCII输出可能是从一张特定的图像中提取颜色值的最清洁的方法,这还让它成为了脚本和简单图像处理最理想和最适合的方法。

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

请注意输出的是纯文本,你也可以使用各种UNIX文本工具对它重新进行格式化处理。但是,要注意ImageMagick输出的那些值与行长度的输出没有任何关系。

同样,你也可以在IM中将PGM和PPM的输出质量设置“depth”只指定为8或16。而NetPBM本身有一个硬性限制,深度必须为16位(最大值为65535)。目前还没有出现可以更好地控制NetPBM图像实际最大值的方法,虽然也有人提出一些未来的方案Future Proposal。

这里是另一个例子,将输出一个9×9阵列的灰度值从0到255,并且是从内置的玫瑰图像中提取的。

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

在上面的NetPBM程序中,使用了“pnmtopnm -plain”命令来替代“-compress none”。老版本的这个NetPBM命令的变体包括的“pnmnoraw”和“pnmtoplainpnm”。检查你的NetPBM包的手册页,因为开发者似乎无法决定到底该如何做。

任何这些PbmPlus程序都将在图像行的最后输出一个换行符,这是ImageMagick的编码中没有做的事情。

这里是输出一个非常小的ASCII PBM位图的例子。

  convert label:O pbm: | pnmtopnm -plain

请注意,PBM位图甚至不需要在值之间输出空格,尽管允许这样做(IM会输出它们)。另外还要注意在位图中 白色=“0”而黑色=“1”。这是位图格式例如XBM和PBM的标准,并且ImageMagick对位图的读取和写入操作也使用这个形式。它只是这种格式的默认约定。

PbmPlus/NetPBM的深度(Depth)控制

有时候可能你需要更好的控制PGM和PPM图像的深度,例如使用百分数范围值从0到99。

一种方法就是使用NetPBM程序“pamdepth”,它可以将图像转换为任何范围(最大可达到整形数的上限65335)。例如在这里都是相同的图像矩阵值,但是使用了0至99的输出值范围。

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

下面是另一个例子,但是这次使用了相反的“+level”选项来设置输出值的范围。这可以让你对值的转换具有更多的控制权。

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

上述命令中的“+depth”选项是至关重要的,它把图像文件的深度设置为和IM质量水平相同。所有需要完成的就是将值重置为“99”,并选择将图像压缩恢复为原始的二进制NetPBM图像格式。然而,由于PbmPlus/NetPBM存在65535(16位)的最大深度,所以这将仅适用于IM Q8或Q16的版本。

PbmPlus/NetPBM评论

IM将会从PbmPlus/NetPBM文件格式头中读取和写入单个或多个评论行。例如

  convert -size 2x2 xc:grey +depth -compress none PGM:-

不过,对于大多数的应用包括PbmPlus本身,都会忽略这个评论行,甚至丢弃它们。

 convert -size 2x2 xc:grey +depth PGM:- | pnmtopnm -plain

PbmPlus/NetPBM与ImageMagick

PbmPlus/NetPBM图像处理套件曾经一度是ImageMagick的命令行图像处理方面的对手,但它使用了一种完全不同的(更低级)流水线滤波理论来进行图像处理和加工。这使得它在shell脚本中更容易使用,但是对于一般或非常复杂的图像处理使用起来很困难。这也意味着需要更频繁的使用进行图像文件格式转换的那些图像,通常需要使用许多的临时文件。

PbmPlus/NetPBM图像一般不会处理透明度(虽然新版PAM格式可以处理了),并且没有提供将图像元数据传递给图像数据的一般方法。

所有的PbmPlus/NetPBM格式(例如ImageMagick的内部格式“MIFF”)都可以处理多图像的流,只需要一个接一个的将图像连接起来。这使得它非常适合流水线、多图像流的图像处理方法。不过需要提醒的是,有些PbmPlus/NetPBM程序只能处理单张图像,并且不会处理多图像的流。

然而,因为它是更加底层并且比ImageMgaick出现得更早,它经常被选定为原始图像输出,例如视频图像的输出和处理。PbmPlus图像也更常用于科学数据,因为这些图像通常要存储为线性RGB颜色空间,而不是更常见的非线形sRGB颜色空间。

这两个软件包可以同时存在,并且我也已经知道使用PbmPlus/NetPBM来完成有些事情了,而不是ImageMagick。通常当使用特定的底层图像处理时,或者脚本使用图像形式存储的数组值时,这两个包可以很好的一起工作,建议进行高级图像处理时同时安装它们。


我其实参与了1995年NetPBM重要的补丁发布,在这段时间,这个软件几乎没有进行更多的修改了。正因为如此,我才能对PbmPlus软件和图像文件格式有一个很好的理解。

从那时起,它被不同的人重建了很多次,最终似乎成为了一个适当的开源项目。各种程序慢慢的变得更加成熟,并开始更好地兼容了。

但其中存在的主要问题仍然是缺乏元数据和复杂性。但是作为一个简单的文件格式又恰恰是它最大的优势,使它成为了底层图像和数据处理的理想选择。.

TIFF格式

TIFF格式是Photoshop支持的格式。然而,它具有很多臃肿的功能,并且对于每个应用程序都进行不同的修改,所以使用它时应该格外小心。甚至包括Photoshop在内也没有那个程序可以处理它所有的变异形式。但是,Photoshop可以比其它程序更好的读取它。

我会明确避免使用TIFF图像文件格式,除非你需要专门在Photoshop上工作,或者那个应用程序不能支持其它定义得更好的图像文件格式。

我并不使用TIFF图像文件格式或者Photoshop。如果你需要在IM上大量使用这种格式,也许你可以把你得到的结果提交给我,来让我们放在这里和大家分享。那样你就可以帮助很多同样使用TIFF格式的用户了。

是否有特定的软件包可以读取TIFF格式图像呢,你能做的就是尽量去尝试和观察它。这就是这种格式的问题所在。

JPEG格式的图像转换为TIFF格式

convert image.jpg image.tif

这种方法可能会将JPEG压缩的图像保存到TIFF文件的内部(从JPEG输入中继承),或者产生错误,例如:

    Error: “JPEG compression support not configured”

这是由于TIFF库中没有包含对JPEG压缩的支持。

无论如何,这种方式都不会很好。

你可以通过更改设置使用不同的压缩算法来解决这个问题:

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

警告:在TIFF格式处理中添加“-compress Group4”命令也是可以的,但是你必须从图像中删除所有透明和半透明的像素。通常你可以采用和上面的JPEG图像相同的方式来确认它,通过在最后保存图像之前使用(第一个命令只能处理单张图像)

    -background {color}   -flatten
或-bordercolor {color}  -border 0

Photoshop中的TIFF格式和密度(分辨率)的相关信息和解决方案请参看Photoshop and Density。

TIFF(和MIFF)浮点数精度文件(IM v6.2.6-5版本中添加)。

它对于HDRI图像处理的效果特别好(IM内部本身就使用浮点数)。

单精度浮点数设置:

  -depth 32 -define quantum:format=floating-point

双精度浮点数设置:

    -depth 64 -define quantum:format=floating-point

14位TIFF图像:

    convert 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://www.imagemagick.org

12位TIFF图像,将16位TIFF图像转换为12位:

  convert image.tif -depth 12 image-12.tif

纯黑白图像:

 convert image ...  -type truecolor -type bilevel   image.tiff

产生的结果是最小文件大小的正常图像,并且可以在Photoshop、Microsoft Windows Picture和Fax Viewer中正确显示。

Windows Picture、Fax Viewer和Windows Explorer都只能显示具有确定光度解释值的TIFF图像,例如RGB。IM选项为

 -compress LZW -type TrueColor

开关光度解释(IM v6.3.2-10版本加入):

    -define quantum:polarity=min-is-black
    -define quantum:polarity=min-is-white

保存TIFF文件格式使用一行每条:

 -define tiff:rows-per-strip=1.

使用多行每条:

-define tiff:rows-per-strip=8

你也可以指定格式中的二进制整形数的“endian”顺序。

    -endian MSB          -endian LSB

为了得到较小的TIFF图像,除了压缩,你也可以尝试和使用其它选项设置,例如“-depth 8”命令可以降低颜色的质量,或者“+matte”选项可以删除图像中的阿尔法(透明)通道

IM将把灰度图像保存为灰度TIFF格式,如果图像中不存在非灰度的颜色。你也可以强制将它保存为非灰度的:

多页TIFF

如果你想将多页TIFF分割为单独的许多页面,IM可能会出现问题,因为它使用了大量的内存来保存当前的页面,即使你使用这样的命令:

convert "a.tif" b%03d.tif

可能更好的解决方案是使用非IM的“tiffsplit”程序。

TIFF和EXIF配置文件

Cristy报道说:libtiff外接库可以支持EXIF配置文件,但是它并不可靠,而且会频繁的产生错误,所以我们把这个调用给注释掉了。

如果需要获得EXIF属性,请尝试:

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

剪辑路径

TIFF格式可以包含有剪辑路径形式的位图蒙版。你可以使用这个路径来屏蔽图像。

convert image_clip.tif  -clip   image_masked.png

当使用了“-clip”选项后,只有包含了剪辑路径的像素才允许被修改(更新)。这和“-clip-mask”选项几乎采用完全相同的方式,或者对第三张图像使用Composite Masking。

蒙版被指定为SVG路径规范,你可以分别提取它们,使用下面的命令。

 identify -format '%[8BIM:1999,2998:#1]' image_clip.tif

经常出现的最大问题是它会将所有不修剪的部分变为透明的。这里有一个解决方案。

convert input.tiff  -alpha transparent -clip -alpha opaque -strip out.tiff

上面的命令将图像转换为透明的(保持颜色),并允许使用剪辑路径,然后让剪切路径中的所有部分都变为不透明的。但是,它确实只适用于在开始时就是完全不透明的图像。

BMP——Windows位图

Windows桌面图标的图像格式BMP(简称位映射)是一种非常不友好的图像格式,并且应该尽量避免使用。

ImageMagick可以支持8位、24位和32位的BMP图像。

在你的命令行最后添加上“-colors 256”(输出图像名的前面),以创建一个8位的BMP,而不是24位的BMP图像。在执行完处理操作(例如旋转、缩放等)之后,还可以在图像中添加额外的颜色。请参阅颜色量化的介绍获得更多颜色信息。

图像中是否包含透明度颜色决定了它使用24位(RGB)还是32位(RGBA)的BMP格式图像。你也可以使用“+matte”选项来关闭图像的透明度。

如果图像中所有颜色都是灰色的,那么就会生成一张“directcolor”灰度图像。而使用“-type truecolor”命令可以阻止这种行为。

如果你使用的老版本的程序不能读取ImageMagick生成的默认BMP4图像(例如Windows背景图片),你可以使用下面的命令强制生成BMP3格式的图像。

  convert image BMP3:image.bmp

这种格式的图像不能包含有透明度颜色,应该是一张“打印图像”,换句话说,就是要保证与Windows的兼容性。

但是,如果使用了一个PNG输入文件,而且其中包含了gAMA和cHRM块(伽马和色度信息),不论哪一个都会让“convert”命令强制产生BMP4格式的图像。如果你要获得BMP3格式的图像,就必须要丢弃这些信息。一种方法就是对图像进行流水线操作,使用最小的“只包含图像信息”的图像文件例如PPM,然后再重新保存为BMP3格式。虽然比较复杂,但是它应该可以实现目的。

convert image.png  ppm:- | convert – BMP3:image.bpm

IM不能产生BMP的深度水平(depth levels)除了8。但是,你可以使用NetPBM图像处理设置在最后将图像转换为其它深度水平(这需要至少Q16版本的IM)。

convert image +matte -colors 16 ppm:- |\
      pnmdepth 4 | ppm2bmp > image.bmp

格式限制

BMP2的格式头:这种格式只允许描述图像的宽度、高度和位深度(每个像素的位数)。位深度可以是1、4、8或24。

相比较而言BMP3:格式允许的位深度为0、1、4、8、16、24和32,并且有额外的字段指定x和y的分辨率(像素每米)和图像数据的压缩类型。

ICO

要创建一个多分辨率的ICO格式图像,只需要按你需要的尺寸创建出所有的图像,并把它们写入到同一个ICO文件中。

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

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

大多数的数码相机,除了Sigma Foveon传感器和一些索尼的照相机,都会转换成图像,通过镜头中数以百万计的传感器检测指定颜色的亮度(包括红色、绿色和蓝色)得到数字数据。为了让相机对颜色的反应和人的眼睛对颜色的反应方式大致相同,照相机中一般绿色传感器的数量是红色或蓝色传感器的两倍以上,因为我们的眼睛对绿色光线更为敏感。传感器都被排列在拜耳阵列中。如果希望了解排列的详细说明和安排图表,请参考Understanding Digital Camera Sensors。

将数据从拜耳阵列转换为更加熟悉的RGB像素需要进行一个被称为去马赛克的处理。但是就算完成了此操作,我们仍然还没有得到一张可以展示的图像。即使具有如此多的绿色像素,但是相机的传感器仍然达不到我们对颜色的反应方式。如果你拿一张白纸,在明亮的阳光下观察它,然后进入室内荧光灯下再观察它,这两种情况下它看起来都会是白色的。但是如果你使用默认的相机设置在两种相同的环境下拍摄这张纸,纸张会在屏幕上显示出略有不同的颜色。原因是,虽然我们眼睛里面的视网膜和照相机都会接收到完全相同的纸张反射光线,但我们的大脑会对它进行解析,让我们仍然感觉是看到了白色的纸张。而照相机仅仅是测量了纸张反射的红色、绿色和蓝色光线的量,因为在荧光灯下会比阳光环境中包含更多的蓝色光线,所以这张图像看起来将会比在阳光下拍摄的图像更蓝。如果产生的白色纸张的图像,都要求对它们进行“白平衡”处理,也可以叫做灰度平衡或色彩平衡。白平衡的更多信息请参阅Understanding White Balance。

原始文件其实还有许多其它方面必须进行调整,例如设置正确的伽玛值(gamma),虽然我们不会再深入介绍了,但是可以知道原始文件需要进行很多处理,才可以成为一张我们在显示器上查看的图像。

相机原始数据文件通常也被称为数码底片。如果你用照相机照了一张照片,而它生成了JPG图像,说明照相机已经完成了去马赛克和其它所有的调整。但是例如,如果你在照相之前忘记正确设置相机的白平衡了,你将不能再使用JPG图像来完全纠正这种情况,因为非常多的原始图像信息已经丢失了。另一方面,如果你的相机产生一个原始文件,而不是一张JPG图像,从原始文件中你就可以选择一个特定的白平衡设置或者其它参数,并且如果转换过程中生成的图像看起来不漂亮,你还可以回退更改设置,然后再次进行转换,直到你看着满意为止。这就类似于使用底片来产生更多的打印照片。如果没有底片,你将无法从一张4×6快照中得到8×10的放大图像。

同时ImageMagick还可以处理各种不同的格式,它其实并不知道如何转换原始(RAW)相机文件,所以IM使用了“dcraw”外接程序将原始文件转换为一种它支持的格式,可能是TIFF(具有“-T”标志)或者PNM格式。请注意,它是专门为原始相机图像所设计的,而不是其它地方获得的图像,例如扫描仪。“dcraw”程序可以处理大量不同的原始格式,包括来自佳能、富士、柯达、尼康和索尼生产的照相机。

你可以通过命令它来识别一个样本来确定“dcraw”程序是否支持你提供的原始文件。命令如下:

  dcraw -i CRW_9641.CRW

它将会返回:

CRW_9641.CRW is a Canon EOS 10D image.

当IM调用“dcraw”进行转换时,将会采用外接命令来查找文件,它指定了两个可以影响图像处理的标志:

  dcraw -w -4 -O output_file input_file

“-w”标志表示“dcraw”将使用原始文件中的白平衡信息,如果它可以被找到的话。但如果无法找到这个信息,“dcraw”将会使用整体图像的平均值作为白平衡的基础。

“-4”标志表示“dcraw”只会对原始照片进行去马赛克和白平衡处理,并输出16位的线性图像(每个像素48比特),适合于IM默认的Q16版本。

因为“-w”和“-4”是指定的仅有的两个图像处理标志,另外还有一些dcraw默认使用的。输出颜色空间为sRGB并且没有ICC配置文件(在我的系统上,dcraw是在没有LCMS库的环境中编译的,因此它不能完成配置)。

设置“-4”标志实际上意味着许多处理步骤都会被省略,包括色彩水平(level)调整和伽玛校正,因此产生的图像会显得较暗。它的目的是,用户可能将会采用图像编辑器来处理图像,例如“Photoshop”或“Paint Shop Pro”,甚至是“ImageMagick”来调整图像的颜色水平和伽玛值等。在这种情况下,图像应该输出为支持16位色彩的格式(例如TIFF格式)。

请注意,“dcraw”产生的仅仅是一个16位的文件,并不意味着其中所有16位都包含了有用数据。例如,佳能10D数码单反相机的原始图像为10位的。最近佳能和其它厂商生产的相机大部分为14位的。

如果你想完全转换你的原始照片,将不得不删除“-4”标志,这样“dcraw”程序将会进行去马赛克、白平衡、亮度和伽玛校正等操作。在这种情况下,“dcraw”将输出一个8位的文件(每像素24比特)。如果你想对这张图像做进一步的处理,最好是将它输出为PNG格式并且避免使用JPEG压缩。JPEG格式只应该在实际使用中作为最后一步。事实上,在图像处理的中间步骤里使用PNG等无损格式(或IM的内部格式MIFF)始终是一个好主意。

可以通过添加特殊的“dcraw”外接程序来控制读取原始相机图像格式的方式。

需要更多的信息可以参看DCRaw WebSite网站,或者DCRaw Tutorial Website网站,其中介绍了许多“dcraw”的可选标志,包括使用各种标志的原始图像直方图信息。

MPEG 、M2V和AVI电影格式

IM并不非常适合用来创建电影。它可以完成这些工作,虽然需要外接程序“mpeg2encode”进行许多繁重的处理。最主要的问题是,IM并不是被设计来处理视频的,而是静态图像或  小的图像序列。这并不是说它不能做到这一点,但这确实不是它的目标。特别是IM需要将所有图像读入内存中,然后从那里处理它们。对于大的或长的视频,这种方法就显得效率很低了。

但是,对于处理小的帧序列,它确实是不可超越的。事实上,几乎所有的Linux视频操作程序都使用ImageMagick来生成标题、特效场景变化以及完成对大型视频的后期处理效果。但是,处理必须保证是对小的视频序列。

下面让我们看看IM可以做些什么吧。

帧到视频

有一些报告显示,如果图像不是正确的宽高比,那么在旧的MPEG播放器上纠错操作将会失败,或者使用扩展MPEG II(m2v:)来替代。

也可以使用m2v,以避免可能产生的重压缩像素化,使用下列命令:

 convert *.jpg glacier.mpg

例如改用:

  convert *.jpg m2v:glacier.mpg

注意:您可能需要大量的临时空间来处理大型的动画。你可以指定一个不同的目录,使用:

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

替代方案

将PNG图像转换为MPEG2视频流,而不是MNG格式的多PNG文件,使用下面的外接程序:

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

更多的信息请参见mjpeg.sf.net。

IM论坛中有用户报告了一个称为“ffmpeg”的开源项目可以产生非常好的结果,它似乎是一个相当标准的Linux包安装。

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

用一个透明的背景提取MVG:

convert -background none -size 320x240 sample.mvg out.png

Michael Lenh写道:我终于能够使用mplayer创造出一个非常性感的视频了

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

你可以在下方的网址中看到结果:

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

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

mabu在IM论坛讨论中说道:使用mencoder,仿佛速度提高了1000倍!

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

它可能包含有我不需要的附加选项,但是它从.jpg文件中创造了良好的延时。

Dean S. Messing使用了转码:
     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

如果愿意你可以省略“-j”(裁剪窗口),那么“-g”就是输出尺寸。

Wolfgang Hugemann还推荐了一种新的选择,就是Windows Vista系统下的“VirtualDub”,它可以让你直接从存放图像帧的文件夹中直接播放或转换视频。

视频到帧

“mplayer”和“mencode”都可以比IM更加高效地把视频转换成一系列的帧。在此之上,它们还可以提供几乎任何视频和音频编解码处理。

例如从视频的1.5分钟处抓取5帧,并将视频缩放为320×240,可以使用:

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

其它选择还包括“ffmpeg”开源库,虽然它也是“mplayer”处理的一部分。

DPX(数字图片交换格式)

这种格式用在电影和特效行业,具有丰富的头信息和格式的灵活性等特殊的用途,能够使用RGB或YCbCr像素描述在各种不同的位深度下处理高动态范围和对数色彩值。它是基于,但在很大程度上取代了柯达Cineon格式,拥有更多特定的电影头。

使用它的一个例子就是在后期制作中扫描电影时。每个帧将存储为单独的.dpx文件,从2k(2048像素宽)到8k(8192像素宽——为IMAX帧),可以是任何8位每颜色到64位每颜色之间的值。这些序列接下来可以使用合成软件进行处理,改变颜色或增加视觉效果。一旦完成,它们可能会被以数字形式记录到磁带上或返回到电影中。

每个像素的颜色值通常存储为对数形式(尤其是如果序列是注定要返回电影中的),这样可以更自然地反映出颜色信息是以何种密度存储在原片中的乳液上的。当没有修改对数文件就进行浏览时,显示出的对比度会非常低,所以需要“查找表”来翻译对数图像,让它与你平常看见的东西类似,如果图像需要被返回电影或在电影院中播放。除了对图像进行线性变换(如最典型的电脑图像)和调整伽玛值水平,这张表还设置了黑色和白色点的位置。

对于10位的对数图像,每个颜色分量的取值范围从0到1023,其中黑色和白色点通常设置为黑色是95和白色是685。这意味着对数文件存储的颜色值比线性版本显示的纯白色更明亮,而比显示的纯黑色更暗。因此,这些额外信息仍然要提供给特效师,它可能希望在保存为dpx文件后,仍然可以修改图像的亮度。

作为一个例子,这个信息已经丢失了,而减少图像的亮度通常将导致图像中的亮点变得较暗,但是这些额外的信息可以使亮点的尺寸减少,并且可以显示出以前太过明亮的区域的细节。后者可以模拟出与现实世界更相近的情况。

文件头中可以包含电影或电视涉及到的具体产品数据。例如,电视头中可以包含SMPTE时间码,因此从产品编辑中导出的dpx序列可以很容易地更换,一次性添加所有的效果。电影头中包含有电影卷信息和摄像时的各种相机设置信息。所有这些细节都将与影像一起保存,并传送给后期制作公司。

 

给DPX文件添加时间码

你可以使用以下命令给任何DPX文件添加时间码:

  convert -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 <seth.info_AT_dubieniec.co.uk>,从长期在IM论坛上关于DPX格式的讨论中总结的。他目前正在开发DPX的应用,所以可能还会有更多的DPX信息。

注意事项

增加“-depth 10”命令将使IM输出一个10位的DPX文件。——James Fancher

如果你要设置伽玛值,例如在输出DPX图像中:

    -define dpx:television.gamma=1.7

DPX图像的色彩空间是根据图像是元素描述和转移特性来定义的。如果转移特性是“PrintingDensityColorimetric”,那么我们将把颜色空间设置为“LogColorspace”。只有当颜色空间是“Log”时,我们才会应用伽玛值和黑/白点转换为RGB颜色空间。你使用的程序有可能并不符合SMPTE标准或ImageMagick没有正确解释这个标准。发表你的两张DPX图像的URL,我们将下载并尝试测试是否是ImageMagick有错误,或者你正在使用的程序有错误。

下列命令将工作在ImageMagick6.3.8-3版本中:

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

作为另一种选择,可以学习一下SMTPE文档。——Cristy

PSD

PSD图像文件是一张Photoshop的工作图像文件格式,就像XCF是GIMP的工作文件格式,而MIFF是ImageMagick自己的工作文件格式一样。

它们通常包含了多张图像,其中第一张图像是当前工作图像合并而成的。这使得它对于查看工作图像来说非常有用,因为它代表并且通常作为“缩略图”使用。

多图像文件格式中的其它所有图像都是用来产生第一张合并图像的。

所以,如果你只是需要最后的图像,我建议你追加一个“[0]”标志到输入文件名后,它将会删除所有的工作图像,而是只使用第一张合并图像。

然而,如果你打算使用个别层的图像,需要添加“[1–1]”标志来跳过第一张图像。如果除了第一张图像外没有发现其它额外的图像层,那么第一张图像将被退回。我建议不要使用“-delete 0”命令,因为如果第一张图像后没有其它图像层,它将不会返回任何图像。

如果你还能提供更多的信息,或想提交一份使用IM处理这种格式的总结,我们将会非常高兴。

对于包含CMYK图像的PSD文件,你可能需要在转换时让IM使用正确的外接程序(确保你的IM安装了LCMS外接库)。

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

参看配置文件的介绍获得更多信息。

如果PSD图像中包含一张预览图像。那么此图片将作为读入的两张图像中的最后一张返回。

为了确保IM从不读取最后一张图像,那么使用:

  convert test.psd[0--2] -flatten test.jpg

这将读取所有的图像,除了最后一张。但会总是读取第一张。

WMF

这是另一种向量格式,通常用于微软Office系列程序中的可伸缩剪贴画。可以通过在读取图像前改变“-density”选项来缩放输入图像。

参看关于矢量图像格式的介绍。

Flash动画(SWF)

IM目前不支持Flash动画。

只是为了完善Scott Bicknell的报告,SWF Tool工具程序“swfextract”可以从Flash动画中提取JPEG或PNG帧。

Wolfgang Hugemann也认为Windows的免费工具“IrfanView”同样可以做到这一点。

这可能确实是一个很好的候选外接程序。

 

网页转换为图片(HTML)

如果IM加载一个HTML文件,它会寻找名为“html2ps”的程序将HTML转换成Postscript然后它可以被渲染为一张图像。这种方法虽然效果不很好,但确实可以工作。

使用完整的网页浏览器可能是一种更好的方法,因为它是专门被设计出来完成这项工作的。使用浏览器最简单的方法就是直接在浏览器中加载页面,然后获取它的屏幕截图。这将得到页面的一张完美的图像,但会受限于浏览器窗口的尺寸。

另一种方法是,让浏览器将页面输出为Postscript,而不是让IM来转换。这可以将网站更好的分成较小的页面。

Linux环境下,你可以启动虚拟的X窗口显示服务,它足以运行一个浏览器来显示整个网站。接着浏览器会在其中运行,并设置为填满整个画面。该网站将被加载并再次抓取一张屏幕快照。我看到过一个脚本,它甚至可以自动化的实现整个复杂过程。但是,你可能会得到一张很长的图像。并且你也很难知道到底要显示多大。

基本上这并不容易,最好的解决方案就是只使用IM进行最终的图像处理,而不是用HTML来生成图像。

 

PCL打印格式

IM PCL默认的是PCL版本6。

版本5中,你需要将你的图像转换为黑白色的。

例如:

  convert image.png -monochrome image.pcl

柯达PhotoCD或ProPhotoCD(PCD)

柯达PhotoCD文件是一种多分辨率的图像文件格式。就是每个文件都包含了6种不同尺寸的相同图像,形成了一种称为“金字塔的图像”。文件中的第一张图像是分辨率最低的(最小尺寸),而最后一张是分辨率最高的(最大尺寸为3072×2048像素)。

用户通常会采用最高分辨率的那张图像进行处理,比如将PCD图像转换为其它一些格式例如JPG格式时,将会从图像文件中抓取第六张(索引5)进行处理。

例如:

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

为了得到正确的颜色必须设置“-colorspace RGB”选项。

原始的RGB输出

RGB is a raw data format with the values typically saved as integers

RGB是一个值通常为整数保存的原始数据格式

IM can generate an image in this format using

IM可以生成这种格式的图像,使用:

 convert image.jpg -depth 8  image.rgb

-depth指定了输出的整数的类型,在这个例子中为8位值(24位图)。指定合适的深度是有必要的,或者输入图像和IM质量编译时间设定将决定所用的深度。

但是RGB纯粹是图像数据,甚至不包含图像的宽度和高度!!!因此,无论正在使用该RGB数据的应用是什么,你都要给它提供宽度和高度的信息。

有些程序假定数据是特定的大小,所以你需要使用IM来确保数据是这个大小。例如,512 x 512像素:

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

-resize将图像调整到512×512框中,-extent拉长该框到正好512×512像素正方形框。

IM可以读取RGB数据但是你需要指出数据的宽度和高度,比如将RGB转换为PNG图像文件格式。

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

你也可以使用规范化的浮点数来读取(和写入)RGB。

但是这需要使用特殊的编码定义设置。

参阅HDRI浮点文件格式。

https://www.imagemagick.org/Usage/basics/#hdri_formats

使用C编码(HDRI)生成RGB浮点图像

   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);

读取选项:

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

quantum:format定义了从文件中读取浮点数,然而-depth定义了浮点大小(32 = floats, 64 = doubles)

quantum:scale定义了如何从标准化的0.0到0.1值按比例缩放为IM的Q16版本所需的内存中的16位质量水平。

阅读余下内容
 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号