一般场景
图片缩放
这方面的属于入门级内容,使用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,因为不满足条件) (><参数可以搭配 ^! 使用)
原图
100×100
100×100^
100×100!
100×100>
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] |
特殊场景
特殊缩放
有时候会有这样的要求:
- 当图片太大时缩小。
- 当图片太小时,不进行放大,而是在其周围填充白边。如下面所示:
解决思路是利用ImageMagick的合成功能。先使用-resize缩小太大的图片。接着再使用-composite参数,跟一张预先准备好的空白图合并,即可实现这种要求。具体命令如下:
1 |
convert [original image] -resize 220x220 '>' -gravity center white.png +swap -composite [new image] |
这种方式也容易合成特殊的背景图,只需要把白色图换为其他图片即可。
处理CMYK图片
跟RGB一样,CMYK也是一种描述颜色的方式。RGB使用红、绿、蓝三色来表示色彩。CMYK则是青、品红色、黄色、黑色表示色彩。当用户上传这种颜色的图片而我们没有妥善处理时,就会出现一些意想不到的情况。先准备三张图片,分别是:
- CMYK颜色的原始图片
- 对图1使用 -strip 处理后的图片
- 图1从CMYK转换为RGB后的图片
三张图片在不同浏览器的表现如下:
通过以上可以发现:
- 大部分浏览器不完全支持CMYK图片。其中Chrome和Safari支持的最好,Firefox则默认使用RGB颜色显示图片,IE(6,7,8)则根本不支持CMYK(所以出现了X)。
- 从CMYK转为RGB,不可避免的会出现颜色失真。可以对比Chrome的第一张和第三张图片的颜色区别。
- 去除全部profile后,会导致图片严重失真。因为CMYK颜色表是存储在profile中的,一旦去除就无法获知确切的颜色,所以Chrome和Safari在显示第二张图片时才会那么怪异。
综上,在处理CMYK图片时要注意以下2个问题:
- 为了兼容所有浏览器,必须将图片都转换为RGB颜色。在ImageMagick加入参数-colorspace RGB即可。至于从CMYK到RGB后颜色失真的问题,则是不可避免的。不妨把这个任务交给用户。若用户觉得这种失真是不可接受的,则可以自行转换并重新上传。
- 若想保留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] |