用户工具

站点工具


doc:i:imagemagick

ImageMagick:强大的图片处理工具

Photoshop、GIMP 等是地球人耳熟能详的图片处理工具,GUI 的东西能捕获绝大多数人的心,因为它们的直观性、易操作性都天生地优于命令行(CML)的工具。然而,CML 的工具更符合 UNIX 的哲学,它们使用灵活,强大的组合性可让“小溪汇成江河”。

ImageMagick 就是一款 CML 的图片处理工具,它不仅完全胜任付对图片的一般操作,更有甚者,还是 image processing 不可多得的好工具。下面的简介是为了抛砖引玉,侧重于 ImageMagick + bash 编程。

ImageMagick 命令的格式和一些常见命令

ImageMagick 命令的格式是

command [option] input_image
command [option] input_image output_image
command [options] image1 [options] image2 [options] output_image

下面的命令是常用的:

  • convert:用于九十多种格式之间的转换,调整图片大小,翻转,剪裁,去斑,模糊等。
  • mogrify:格式转换类似于 convert,不过 output_image 替换了 input_image。这个命令要小心使用。
  • display:显示图片
  • identify:描述图片的格式和特征
  • import:拷屏
  • montage:产生缩略图阵列
  • composite:叠加图片,即将一个图片放置在另一个图片上方
  • compare:比较并标出图片及其重构之间的差异

譬如,要把图片 sample.jpg 从左上角开始剪切下 300×200 的一块,然后缩放到 400×300 后再旋转 90 度变换成油画风格,最后在 100,20 的位置添加文字水印 “IOU's artifact”(白字,字体大小为 12)保存为图片 sample.png。利用 convert 来完成这一系列编辑动作,如同用自然语言来下命令。

convert -crop 300x200+0+0 -resize 400x300 -rotate 90 -paint 4 -fill white -pointsize 12 -draw "text 100,20 'IOU\'s artifact' " sample.jpg sample.png

本 wiki 不说这些命令的细节,ImageMagick 的联机手册给了详细的介绍。我们想说的,跟 ImageMagick 魔咒 表达的相似,即 ImageMagick 在 shell 编程的帮助之下,能做很多 GUI 无法企及的事情。

利用 BASH 来做一些复杂的图片处理

有关 ImageMagick 脚本,我推荐 Fred's ImageMagick Scripts,就从这里我开始迷恋 ImageMagick 的。读好的代码是一个好的开始。

下面,我们举几个例子来小窥一下 ImageMagick 的强大。

图片的模糊化

要解决的问题是这样的:给定一个彩色图片,先把它分为很多 10×10 像素的小块,再把每个小块用它的主色彩填充,把这个过程存为动态图像,就像下面这样。

这是一个小游戏,没啥科研价值,只是为了好玩。其中,用到了 Fred's grid.sh 脚本,和下面的脚本(用于发现图片的主要颜色)。

#!/usr/local/bin/bash    
# Purpose: Find the major color of an input image
# File name: FindMajorColor.sh
# Author: IOU
# Date: 06-07-2013
#
######

# Extract the information about image size by "identify"
ImageSize=`identify -quiet $1 | head -n1 | awk '{ print $3 }'`

# Use identify to find out the distribution of colors in HEX
ColorCode=`identify -verbose $1  | grep \# | awk -F: '{ print }' | sort -r | head -n1 | awk '{ print $(NF-1) }'`
FileName=`basename $1`
tempFileName="tmp.bmp"

convert -size $ImageSize xc:white $tempFileName
convert $tempFileName -fill $ColorCode -draw 'color 0,0 reset' $tempFileName
mv $tempFileName $FileName

exit 0

完成这个小游戏的 BASH 脚本如下。用法是 ./ApproximateImage.sh infile,生成的 animate.gif 即是我们想要的结果。

#!/usr/local/bin/bash     
# Purpose: convert an image to its approximation, by changing
# each small square patch to a canvas of its major color.
# File name: ApproximateImage.sh
# Output: animate.gif
# Usage: ./ApproximateImage.sh infile && display animate.gif
# 
# Author: IOU
# Date: 06-07-2013
#
######

PatchLength=10                                # the side length of each square patch
PatchSize=`echo $PatchLength"x"$PatchLength`  # the size of each square patch

# set up functions to report Usage and Usage with Description
PROGNAME=`type $0 | awk '{ print $3 }'`  # search for executable on path
PROGDIR=`dirname $PROGNAME`              # extract directory of program
PROGNAME=`basename $PROGNAME`            # base name of program

# Get the filename of infile and crop the infile into patches
FileName=`basename $1 | awk 'BEGIN { FS="." } { print $1 }'`
convert $1 -crop $PatchSize  +repage  +adjoin  $FileName-V%03d.bmp


for file in $( ls $FileName-V*.bmp); do
    file=`basename $file`
    $PROGDIR/FindMajorColor.sh $file
done

# the properties of image
ImageSize=`identify -quiet $1 | head -n1 | awk '{ print $3 }'`
ImageWidth=`echo $ImageSize | awk 'BEGIN { FS="x" } {print $1}'`
ImageHeight=`echo $ImageSize | awk 'BEGIN { FS="x" } {print $2}'`

let "ImageWidth /= $PatchLength"
let "ImageHeight /= $PatchLength"
size=`echo $ImageWidth"x"$ImageHeight`

# Rebuild the image
OutFile=$1.rejoint
montage -geometry $PatchSize+0+0 -tile $size $FileName-V*.bmp $OutFile
rm -f $FileName-V*.bmp

$PROGDIR/grid.sh -s $PatchLength $1 $1.grid
$PROGDIR/grid.sh -s 60 -c white $1.grid $1.grid

$PROGDIR/grid.sh -s $PatchLength $OutFile $OutFile.grid
$PROGDIR/grid.sh -s 60 -c white $OutFile.grid $OutFile.grid

convert -delay 30 $1 $1.grid $OutFile.grid animate.gif
rm -f $OutFile*
rm -f $1*.*

exit 0

再上传一张我们无比崇拜的偶像 Knuth 大师的特写,以及利用上述脚本得到的图片的模糊化.

/data/vhosts/wiki-data/pages/doc/i/imagemagick.txt · 最后更改: 2013/06/11 12:00 由 IOU