在命令行下用 ImageMagick 进行高级图形编辑
来自 LinuxToday 的消息 (原文出自 NewsForge.com):
原来我使用 ImageMagick 最多的就是把
.jpeg/.gif/.png
之类的图片转换成 .eps. 读了此文之后,才知道 ImageMagick 还有这么多有趣的编辑功能。这些编辑功能对于单副图象可能意义不大,但如果你想对一批图标(比如网站中的大量的表情图象、软件的大量按钮图象或者大批的 logo 等)进行 3D 效果渲染,配合 bash 脚本和 ImageMagick,将会是一件很快的事情。简单翻译一下,以方便中国的 Linux 爱好者。
在命令行下用 ImageMagick 进行高级图形编辑
作者:Shashank Sharma, 译者:Exaos Lee
ImageMagick (IM) 是命令行下的图形创建和编辑应用程序。在 以前的文章 中,我们用它来向图象中增加文本和方框,以及进行其它的一些基本图形操作。在本文中,我们将使用 ImageMagick 的一套命令来创建一个多图象的马赛克,绘制一些基本的形状,以及创建三维的图标。
叠印图象
将一副图象粘贴在另一个上面称之为叠印。利用此技术,我们将一个预制的透明曲线的角部叠印到图形上,可以将一个图象的方角变成圆形的边——或者其它任何的形状。为了将它们放置到适当的位置,我们使用 composite 命令加上 -gravity
参数调整位置:
$ composite -gravity SouthEast curve_se.png image.png curved-se.png
此命令将弯曲后的东南角叠印到原图象的东南角上。我们可将生成的结果图象作为下一个命令的源图象,将另一个角叠印上去,如法泡制。将图象的其它角弯曲的命令如下:
$ composite -gravity NorthEast curve_ne.png curved-se.png curved-ne.png $ composite -gravity NorthWest curve_nw.png curved-ne.png curved-nw.png $ composite -gravity SouthWest curve_sw.png curved-nw.png curved-sw-final.png
参数 -gravity
用于放置图象的位置 还有更多。
创建马赛克
我们可以将更多的图象叠印到表面的不同位置从而创建出马赛克出来。除了用 -gravity
参数所提供的固定位置外,我们还可以用 -geometry 参数来指定图象上的位置。首先,我们创建一个工作用的画布,并用 xc 参数来指定它的颜色:
$ convert -size 200x200 xc:wheat multiple.png
然后,我们放置不同的图象到画布上,使用 -geometry
参数指定它的水平和垂直坐标:
$ composite -geometry +15+30 1.gif multiple.png multiple.png $ composite -geometry +19+20 2.gif multiple.png multiple.png $ composite -geometry +12+28 3.gif multiple.png multiple.png
因为 IM 在打开输出图象之前预先读入所有的输入图象,就可以反复使用同一个输入图象而不需要创建新的图象。图象超出画布的范围会被裁剪掉。为了解决这一问题可使用 -mosaic 参数,它会自动创建一个足够大的画布以包含所有的图象。这种情况下的画布颜色由 -background 参数决定。
$ convert -page +15+30 1.png -page +49+60 2.png \ > -page +52+58 3.png \ > -background wheat -mosaic mosaic.png
你可以在网上找到创建多个图象的马赛克的 更多技巧。
创建图标
IM 可让你在命令行上使用 convert 加上 -draw 参数绘制各种形状,比如长方形、圆形、椭圆、多边形。参数 -fill 用来指定填充形状内部的颜色,参数 -stroke 用来定义边界的颜色。创建一个方形,你需要给出它的左上和右下的坐标:
convert -size 120x60 xc:wheat -fill white \ > -stroke black -draw "rectangle 25,10 95,50" rect.gif
你可以使用曲形的边来创建圆角的方形。这种情况下,在左上和右下坐标你需要指定角部的宽度 (20) 和高度 (12).
convert -size 120x60 xc:wheat -fill blue \ > -stroke black -draw "roundrectangle 25,10 95,50 20,12" rrect.gif
弧线需要起始和结束点及转动的角度 (65,250):
convert -size 120x60 xc:blue -fill white -stroke black \ -draw "arc 90,4 40,50 65,250" arc_partial.png
以给定的点 (45,18) 为中心绘制一个椭图:
convert -size 120x60 xc:magenta -fill white -stroke black \ -draw "ellipse 60,30 45,18 0,360" ellipse.png
一个多边形需要至少三个坐标来定义它的边界:
convert -size 100x60 xc:skyblue -fill white -stroke black \ > -draw "polygon 40,30 20,70 90,40 110,70" polygon.gif
制作 3D 图标
现在你已经有了一点建筑材料,设计一个图标就比较容易了。制作一些形状,加上一些颜色,写上一两个单词,然后你得到一个图标了。ImageMagick 甚至可以加上影子和光照来渲染你的 3D 图标。第一步,为你的图标制作一些形状。这儿我们使用方框叠加两个圆来制作一个胶囊状的形状:
convert -size 200x120 xc:black -fill white -draw 'circle 65,60 28,60' \ > -draw 'circle 135,60 172,60' -draw "rectangle 65,23 135,97" \ > -gaussian 1x1 +matte basic.png
+matte 参数告诉 IM 忽略掉图象的粗糙度——用来决定像素的透明性的量。参数
-gaussian
将于后文解释。然后我们增加一些颜色和文本,结果得到一个 2D 图标。
convert basic.png -fill blue -draw 'color 0,0 reset' \ > basic.png +matte -compose CopyOpacity -composite \ > -font Helvetica -pointsize 20 -fill white \ > -gravity center -annotate 0x0 "Blue Pill" 2D.png
在 -draw 'color 0,0 reset'
中 color 是用来改变像素的颜色的。改变像素颜色的办法很多,比如 point, replace, floodfill 和 reset 命令。reset 命令从指定的坐标开始改变所有像素的颜色。参数 -compose 的 CopyOpacity 选项将源图象的透明层拷贝到目标图象上。我们用 -annotate 参数把文本加入到图象上,并用 -gravity
指定它的位置。现在让我们增加一些 3D 效果。
模糊
模糊是制作 3D 图象的不可缺少的部分。如果你使用阴影效果之前不进行模糊处理,结果图象将会有严重的锯齿。模糊基本图象后,你再进行光滑阴影效果后的锯齿边界。连续使用模糊效果可以使图象更圆润。
convert basic.png -blur 0x4 -blur 0x4 -blur 0x4 -blur 0x4 \ > +matte blurred.png
转换参数 -blur 和 -gaussian 有相同的参数:[半径]x[Sigma]. Sigma 值定义像素扩散的程度(看来起来更圆润),半径定义像素扩散的区域大小。
阴影
下一步,我们希望来一点光照效果,使得图象看起来象是在灯光下。我们对模糊后的图象进行两次这样的操作,顶部和底部各一次,来确定阴暗和光亮的区域。
convert blurred.png -shade 90x0 -normalize light.png convert blurred.png -shade 90x180 -normalize dark.png
参数 -normalize 常常和 -shade 一起用,以增强对比度。我们需要用这两个图像覆盖在我们的阴影效果图上。下一个命令利用了 IM 第 6 版中的新功能,在旧的版本无法工作。
convert \( light.png \( +clone -fx 'rand()' -threshold -1 \) \ > +swap +matte -compose CopyOpacity -composite \) \ > \( dark.png \( +clone -threshold 100% \) \ > +swap +matte -compose CopyOpacity -composite \) \ > -compose Over -composite high_lighting.png
IM 允许你分别处理各个图象并将结果返回给命令。这个功能叫做图象堆栈,在你想按固定顺序处理处理图象时很有用。一个图象堆栈是用括号加上反斜杆标识的,因为 Unix 认为括号是特殊字符。参数 -threshold 定义不透明度。参数 +swap 交换当前图象序列中的最后两副图象。现在我们已经有了 3D 图标所需要的所有素材。将这些加入到 2D 图标中,我们需要用 -compose
参数(在第6版及其后可用)将它们叠加起来。
convert 2D.png high_lighting.png -compose ATop -composite 3D.png
选项 ATop 确保只有在目标图象之“上”的部分才进行叠加。现在我们进行点睛之笔,比如增加背景。
convert 3D.png \( +clone -fx 'rand()' +matte -shade 120x45 \ > -fill gray -fill beige -tint 120 \) \ > -insert 0 -flatten bg_3D.png
+clone
是用来拷贝图象序列中的最后一副图象。如果你不用它,你最终的图象只是用
rand()
创建的背景. -insert
获得图象序列中的最后一副图并将它放于指定的编号中。这样,我们获得最终的 3D 图标。哇!你的 3D 图标已经完毕了。
结论
放置多个图像和进行 3D 效果处理,比如光照,即使在图形化的图象编辑器中也不是件容易的事情。而熟悉 ImageMagick 这些功能,你就可以在命令行下使用这个小软件包进行这些复杂的处理。