ImageMagick的基本使用

ImageMagick的基本使用

选项查询手册

简介与安装

ImageMagick简介

ImageMagick是一个开源的强大的图片处理库,可用来创建、编辑、合成或转换位图图像,比如:调整大小,翻转,镜像,旋转,扭曲,剪切和变换图像,调整图像颜色,应用各种特殊效果,或绘制文本,线,多边形,椭圆和贝塞尔曲线等等。

本文只列出我使用过的命令,并不是完整的教程,随着我平时使用的增加,文章会不断更新,命令会不断增加,当然如果我平时用的少,那可能就只会有这些了。

安装ImageMagick

由于我是macOS,所以使用macOS最常用的包管理器brew来安装

brew install imagemagick

命令使用格式

安装后,它主程序就一个magick,但它会有很多符号链接链接到magick,如下图所示
-w499

既然都是符号链接,从理论上来说,我用identify和用magick应该是一模一样的才对,但实际上却是这样的(如图所示)
image.jpg

我猜是因为它把命令本身也当成一个参数,当它识别到是identify时,它就会做输出图片简略信息的操作。事实上,identify是magick的子命令,所以我们还可以这样写
image.jpg

所以,所有的符号链接其实都是magick的子命令,通用的使用方法是

magick 子命令 参数

但magick却巧妙的给magick创建多个符号链接,并把符号链接名称命名为它的子命令名,这样在使用上就好像是多了一个可执行文件,其实内部还是通过识别符号链接的名称来自动识别到它是子命令,以达到简化命令的目的,让我们可以直接以下边这种方式调用

子命令 参数

常用命令

获取图片信息

#显示简略图片信息
identify /path/to/image.png

#显示详细图片信息
identify -verbose /path/to/image.png

缩放图片

使用resize缩放

#缩放到指定大小
convert /path/to/source.png -resize 200x200 /path/to/target.png

#按百分比缩放
convert /path/to/source.png -resize 50% /path/to/target.png

#多次缩放(本例是缩小再放大,效果就是变模糊了,可用于做马赛克)
convert /path/to/source.png -resize 50% -resize 200% /path/to/target.png

#只缩放宽,高按比例(省略高不写即可,但“x”号还是要写的)
convert /path/to/source.png -resize 200x /path/to/target.png

#只缩放高,宽按比例(省略宽不写即可,但“x”号还是要写的)
convert /path/to/source.png -resize x200 /path/to/target.png

#批量把iPhone拍的照片缩小成指定尺寸
declare -i j=0;for i in *.JPG; do convert $i -resize 1008x ${i:0:$[${#i}-4]}_resized.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

使用sample采样缩放(只采样不插值,一般用于做缩略图)

#原图的50%
convert image.png -sample 50% sample.png

#先缩小再放大,就是马赛克效果
convert image.png -sample 10% -sample 1000% sample.png

设置jpg图片质量

90表示转换为原质量的90%

convert input.jpg -quality 90 output.jpg

旋转图片

旋转90度(顺时针)

convert input.jpg -rotate 90 output.jpg

裁剪图片

#从(50,50)坐标开始,裁剪一个100⨉100大小的图片(乘号用小写英文字母xyz的x就可以)
convert image.png -crop 100x100+50+50 crop.png

#不指定位置,则会把大图片分割成100⨉100的小图片,生成crop-0.png, crop-1.png, ……
convert image.png -crop 100x100 crop.png

把当前文件夹下的所有.jpg格式的图片都从(597,4)坐标开始(矩形左上角顶点),截取大小为1400×1076的图片,并且把图片名称的后27个字符(包括.jpg4个字符)去掉(后面再自己拼上)

declare -i j=0;for i in *.jpg; do convert $i -crop 1400x1076+597+4 ${i:0:$[${#i}-27]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

${i:m:n}表示从字符串i的第m位截取到第n位,在我这里i就是图片文件名(包括.jpg后缀),m是0,n是$[${#i}-27]${#i}是文件名i的总长度。

declare -i j=0;for i in *.jpg; do convert $i -crop 1080x2160+0+240 ${i:0:$[${#i}-29]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

把当前文件夹下的所有.jpg格式的图片都从(0,453)坐标开始(矩形左上角顶点),截取大小为540×744的图片

declare -i j=0;for i in *.jpg; do convert $i -crop 540x744+0+453 ${i:0:$[${#i}-27]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

把当前文件夹下的所有.PNG格式的图片都从(414,4)坐标开始(矩形左上角顶点),截取大小为1530×1242的图片,同时把格式格式转为jpg

declare -i j=0;for i in *.PNG; do convert $i -crop 1530x1242+414+4 ${i:0:$[${#i}-4]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

$[${#i}-4]表示文件名总长度减4(其实就是去掉.PNG这个后缀,然后再自己拼上.jpg)。

declare -i j=0;for i in *.PNG; do convert $i -crop 1242x2000+0+208 ${i:0:$[${#i}-4]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

裁剪到图像边缘

这个功能也可以叫去除图片的空白,就好像对文本去除空格一样,图片也可以去除空白的像素,以得到能容纳图像的最小图片。

比如这是原始图片

我想裁剪成这样,就是除有效图片外的所有空白都裁掉

很简单,使用-trim选项即可

convert /path/to/input.jpg -trim /path/to/output.jpg

除了图片,也可以处理pdf格式(图片也可以使用这些参数)

convert -density 300 -trim -fuzz 1% +repage input.pdf output.pdf

-fuzz 1%主要是设置羽化,1%这个值可以自己看着来修改,-density 300表示设置图片dpi(分辨率)为300,300这个数字可以适当降低(数值越大文件越大),或者如果不用这个选项觉得图片质量可以,那也可以不用。

根据实验,-trim需要和-fuzz 1%+repage一起使用才可以达到截取到图片比较边缘的地方(即几乎不留空白)

convert -trim -fuzz 1% +repage /path/to/input.jpg /path/to/output.jpg

把当前目录下的所有.jpg(可自己修改)格式图片去除空白(即裁剪到图像的边缘)

declare -i j=0;for i in *.jpg; do convert -trim -fuzz 1% +repage $i ${i:0:$[${#i}-4]}_trimmed.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

抠图

"#FFFDF1"为要抠掉的背景色(也可写成rgb(255,253,241)这种格式),-fuzz 90%为允许误差(因为背景可能不是纯色),90%可以换成其它数字,反正我测试数字越大抠的越干净,而且只能用百分数,90%虽然是0.9,但不能写成0.9

convert /path/to/input.jpg -fuzz 90% -transparent "#FFFDF1" /path/to/output.png

批量抠图:把当前文件夹下的所有.jpg图片全部抠图

declare -i j=0;for i in *.jpg; do convert $i -fuzz 90% -transparent "#FFFDF1" ${i:0:$[${#i}-4]}.png;j=j+2;echo $j"."$i" convert succeed"!; done

修改背景颜色

-fill是填充的意思,-opaque是不透明的意思,意思是用-fill指定的颜色去填充(即替换)-opaque指定的颜色(原背景色)

convert /path/to/input.jpg -fuzz 25% -fill "#2DC844" -opaque "#FFFDF1" -flatten /path/to/output.jpg

-fuzz 25%是允许色差(因为你的背景色可能不是完全的纯色),这个数值自己按实际效果慢慢修改,反正25%我觉得不错,但我测试的是纯色背景,如果你的背景色不是纯色,那问题就比较多了。
-flatten意思是使用指定的背景色(有可能用-fill-background指定)创建一个虚拟画布,然后将原图合成到这个画面上。


无背景色png图片添加背景色,-background "#2DC844"用于指定背景色

convert /path/to/input.png -background "#2DC844" -flatten /path/to/output.jpg

批量操作:把当前目录下的所有.png格式的图片全部添加#FFFDF0背景色并裁剪掉一个像素(因为那是边)

declare -i j=0;for i in *.png; do convert $i -background "#FFFDF0" -flatten -crop 1620x3600+1+1 -quality 80 ~/Downloads/生成文件夹/${i:0:$[${#i}-4]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

处理后的图片会被放到~/Downloads/生成文件夹/文件夹中,如果想放在当前文件夹中,可以把~/Downloads/生成文件夹/删除。

修改位深

convert source.jpg -depth 8 target.png

同时缩放和修改位深(用于压缩png图片)

convert /path/to/source.png -resize 1080x1920 -depth 8 /path/to/target.png

格式转换

直接在输出文件中用不同的后缀就行,它会自动识别后缀来转换

convert /path/to/source.png /path/to/target.jpg
convert /path/to/source.png /path/to/target.webp

把当前文件夹下的所有PNG图片转成JPG

#只转成jpg
declare -i j=0;for i in *.PNG; do convert $i ${i:0:$[${#i}-4]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

#转成jpg同时宽高压缩成原来的一半
declare -i j=0;for i in *.PNG; do convert $i -resize 50% ${i:0:$[${#i}-4]}.jpg;j=j+1;echo $j"."$i" convert succeed"!; done

注:${#i}表示获取i的长度,${i:m:n}表示从字符串i的第m个字符开始截取,共截取n个字符,感叹号不能放在双引号里面。

使用效果如下:
image.jpg

多个操作一起使用

直接多个选项合并在一起就行了,比如我要裁剪一个透明png图片,又要给它填充一个背景色,那就是

convert /path/to/input.png -background "#FFFDF0" -flatten -crop 1620x3600+1+1 /path/to/output.jpg

其中-background "#FFFDF0" -flatten是填充背景色,-crop 1620x3600+1+1就是剪裁,但是要注意的是,如果你把裁剪放在填充背景色之前,它会无法裁剪(即生成的图片尺寸还是跟原图一样),我也不知道为什么,同理,可能还有其它的选项合在一起有顺序关系,这个自己试试就知道了。


参考:后台使用imagemagick的convert命令来处理图片真是太方便了。

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
Alex
Alex
6 月 前

test

0
希望看到您的想法,请发表评论。x
()
x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

ImageMagick的基本使用