一般场景

图片缩放

这方面的属于入门级内容,使用ImageMagick必定会用到该方面的功能。主要涉及到 -resize 参数,下面该参数效果进行展示(尺寸参数的细节请参考这里):

  • -resize 100×100: 将原图缩放为100×100,同时保持比例。(结果为:75X100)
  • -resize 100×100^:缩放原图,直到宽或高等于指定的缩放尺寸。(结果为:100×133)
  • -resize 100×100!:缩放原图并在必要时进行拉伸,以符合指定的缩放尺寸。(结果为 100×100,但图像变形了)
  • -resize 100X100>:当原图宽或高大于指定尺寸时才进行缩放,同时保持原图比例(结果为:75×100)
  • -resize 100X100<:当原图宽或高小于指定尺寸时才进行缩放,同时保持原图比例(结果为:150×200,因为不满足条件) (><参数可以搭配 ^! 使用)
original
原图
100x100
100×100
100x100^
100×100^
100x100!
100×100!
100x100>
100×100>
100x100<
100×100<

图片压缩

图片压缩从两方面着手:quality和profile

  • Quality:图片质量越好,占用空间就越大。适量降低图片质量能够很好的减少尺寸。ImageMagick提供参数 -quality 来设置图片质量。0最低,100最好。85是质量和大小间平衡的最佳数值(官方文档说该参数的默认值是85,不过实际测试时发现是100)。
1 convert [original image] -quality 85 [new image]
  • Profile:图片除了包含像素数据外,还可能包括相机信息(相机型号,光圈),Photoshop元数据,颜色表等描述文档。一般最少占用 20k左右的空间,多则达几百K。对于非专业图片网站,一般都不需要用到这些信息,因此大可以去掉节省空间。ImageMagick这方面的参数是-strip
1 convert [original image] -strip [new image]

特殊场景

特殊缩放

有时候会有这样的要求:

  1. 当图片太大时缩小。
  2. 当图片太小时,不进行放大,而是在其周围填充白边。如下面所示:

white-padding

解决思路是利用ImageMagick的合成功能。先使用-resize缩小太大的图片。接着再使用-composite参数,跟一张预先准备好的空白图合并,即可实现这种要求。具体命令如下:

1 convert [original image]  -resize 220x220'>' -gravity center white.png +swap  -composite [new image]

这种方式也容易合成特殊的背景图,只需要把白色图换为其他图片即可。

处理CMYK图片

跟RGB一样,CMYK也是一种描述颜色的方式。RGB使用红、绿、蓝三色来表示色彩。CMYK则是青、品红色、黄色、黑色表示色彩。当用户上传这种颜色的图片而我们没有妥善处理时,就会出现一些意想不到的情况。先准备三张图片,分别是:

  1. CMYK颜色的原始图片
  2. 对图1使用 -strip 处理后的图片
  3. 图1从CMYK转换为RGB后的图片

三张图片在不同浏览器的表现如下: Test-Chrome+Safari Test-Firefox Test-IE

通过以上可以发现:

  1. 大部分浏览器不完全支持CMYK图片。其中Chrome和Safari支持的最好,Firefox则默认使用RGB颜色显示图片,IE(6,7,8)则根本不支持CMYK(所以出现了X)。
  2. 从CMYK转为RGB,不可避免的会出现颜色失真。可以对比Chrome的第一张和第三张图片的颜色区别。
  3. 去除全部profile后,会导致图片严重失真。因为CMYK颜色表是存储在profile中的,一旦去除就无法获知确切的颜色,所以Chrome和Safari在显示第二张图片时才会那么怪异。

综上,在处理CMYK图片时要注意以下2个问题:

  1. 为了兼容所有浏览器,必须将图片都转换为RGB颜色。在ImageMagick加入参数-colorspace RGB即可。至于从CMYK到RGB后颜色失真的问题,则是不可避免的。不妨把这个任务交给用户。若用户觉得这种失真是不可接受的,则可以自行转换并重新上传。
  2. 若想保留CMYK颜色的同时去除profiles,则要保留颜色相关的profile。所以不能再使用 -strip,而是要使用+profile 来选择性的保留profile。8bim, icc, icm存储CMYK颜色表的常见profile,因而我们的参数便是:
1 convert [original image] +profile '!8bim, !icc, !icm, *' [new image]
2 (去除8bim, icc, icm外的所有profile)。

另外,你也许想要知道图片还包含了哪些profile,则可以用ImageMagick的另外一个工具identify:

1 identify -verbose [image] | grep 'Profile-.*bytes'

总结

缩放

1 convert [original image] -resize <参数> [new image]

压缩(兼容所有的浏览器)

1 convert [original image] -quality 85 -strip -colorspaec RGB [new image]

压缩(保留完整图片颜色)

1 convert [original image] -quality 85 +profile '!8bim, !icc, !icm, *' [new image]

特殊缩放(放大时留白边)

1 convert [original image]  -resize 220x220'>' -gravity center  [background image] +swap  -composite [new image]