Linux下图片批量压缩-Imagemagick的convert图像处理
最近开始写博客,从相机导出的图片一般都是3-5m太大,就安装了压缩的插件,但是以前的图片咋办,wordpress批量压缩插件要钱啊,那就自己脚本弄吧
convert是imagemagick软件包中的一个命令。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。这里介绍几个简单的命令,具体的用法请参考man手册或者其官方网站。
在Ubuntu中用命令
sudo apt-get install imagemagick
在CentOs
yum install ImageMagick
Convert的resize命令:
Convert的resize子命令应该是在ImageMagick中使用较多的命令,它实现了图片任意大小的缩放,唯一需要掌握的就是如何使用它的一些参数测试设定值:
此说明文件中所用的原始文件(src.jpg),宽度:200,高度:150
命令格式: -resize widthxheight{%} {@} {!} {<} {>} {^}
1. 默认时,宽度和高度表示要最终需要转换图像的最大尺寸,同时Convert会控制图片的宽和高,保证图片按比例进行缩放。
如:convert -resize 600×600 src.jpg dst.jpg
转换后的dst.jpg的图片大小(宽度为600,而高度已经按比例调整为450).
2.如果需要转换成600×600,而图片无需保持原有比例,可以在宽高后面加上一个感叹号!.
如:convert -resize 600×600! src.jpg dst.jpg
3. 只指定高度,图片会转换成指定的高度值,而宽度会按原始图片比例进行转换。
如:convert -resize 400 src.jpg dst.jpg
转换后的dst.jpg的图片大小(宽度为400,而高度已经按比例调整为300),和例1有点类似。
4. 默认都是使用像素作为单位,也可以使用百分比来形象图片的缩放。
如:convert -resize 50%x100%! src.jpg dst.jpg 或者convert -resize 50%x100% src.jpg dst.jpg
此参数只会按你的比例计算后缩放,不保持原有比例。(结果尺寸为100×150)
5.使用 @ 来制定图片的像素个数。
如:convert -resize “10000@” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(115×86),图片保持原有比例(115×86= 9080 < 10000)。
6.当原始文件大于指定的宽高时,才进行图片放大缩小,可使用>命令后缀。
如:convert -resize “100×50>” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(67×50),图片保持原有比例。
如:convert -resize “100×50>!” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(100×50),图片不保持原有比例。
7.当原始文件小于指定的宽高时,才进行图片放大转换,可使用<命令后缀。
如:convert -resize “100×500<” src.jpg dst.jpg 或者convert -resize “100×100
此命令执行后,dst.jpg和src.jpg大小相同,因为原始图片宽比100大。
如:convert -resize “600×600<” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(600×450),图片保持原有比例。
如:convert -resize “600×600
此命令执行后,dst.jpg图片大小为(600×600),图片不保持原有比例。
8.使用^命令后缀可以使用宽高中较小的那个值作为尺寸
如:convert -resize “300×300^” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(400×300),图片保持原有比例,(300:300 < 200:150,选择高作为最小尺寸)。
如:convert -resize “300×200^” src.jpg dst.jpg
此命令执行后,dst.jpg图片大小为(300×225),图片保持原有比例,(300:200 > 200:150,选择宽作为最小尺寸)。
1、图片顺时针旋转
简单解释下,white是旋转后的填充北京,90是顺时针90度,src.png是源图片,des.png是目标图片
建议每次执行完命令后,查看下目标图片,因为当你看到效果后会有一种喜悦感,使你能够想要去执行下一个命令。
convert -background white -rotate 90 src.png des.png
2、图片格式转换
convert src.png des.jpg
3、尺寸转换
100×100转换后的图片尺寸,90图片质量
convert -colorspace RGB -resize 100×100 -quality 90 src.png des.png
4、从图片中截取一个区域
100×200+10+10三个参数的意思分别是:截取后的尺寸、距离左侧多少像素、距离右侧多少像素
convert -crop 100×200+10+10 src.png des.png
5、添加水印图片
water.png要添加的水印图片,SouthEast右下角当然还有South、SouthWest…等等很多位置,+5+5距离左右边和上下边的空隙。
convert src.png water.png -gravity SouthEast -geometry +5+5 -composite des.png
6、合并图片
+append:如果是+则横向合并,如果是-则纵向合并
convert src1.png src2.png +append des.png
7、设置图片的边框颜色、线宽
边框颜色为红色,上下边框为1像素,左右边框为2像素
convert src.png -bordercolor red -border 1×2 des.png
8、带阴影的边框,跟相册边框相似,超级好看
边框颜色为红色,左右边框宽20、上下边框宽21、左上边阴影倾斜程度22、右下边阴影倾斜程度23
convert src.png -mattecolor red -frame 20×21+22+23 des.png
9、分解gif动图,成多张的单个图片
desdir是分解后需要存放的目录,可以直接放到当前目录,gif_是分解后图片的前缀
convert src.gif desdir gif_%02d.gif
10、从gif中得到某张字图片
获取gif中第三张子图
convert src.gif[2] des.jpg
11、生成文字图片,有时候为了防止抓取,会用到,例如一些商品价格、联系方式等
需要两个命令,先生成画布,再向画布上写文字。
convert -size 200×20 null:white des.png
convert -font helvetica -fill black -pointsize 16 -draw ‘text 4,14 “cuihongbo.com”‘ des.png des.png
12、图片上添加文字水印,其实跟上面生成图片文字是一个原理
convert -font helvetica -fill blak -pointsize 16 -draw ‘text 25,25 “cuihongbo.com”‘ src.png des.png
13、模糊图片
convert -blur 80×5 src.png des.png
14、翻转图片
flop左右翻转,flip上下翻转
convert -flip src.png des.png
15、其他的各种效果(底片效果、黑白颜色、噪声、油画效果、马赛克、铅笔画效果、毛玻璃效果、漩涡效果、凸起效果)
下面参数spread是毛玻璃,其他的一些命令:
negate:底片效果、noise噪声、paint油画、sample马赛克、charcoal铅笔画、monochrome黑白效果、swirl漩涡、raise图片
使用这些命令的时候最好去官网看下后面接的参数。以免出错。
convert -spread 30 src.png des.png
命令还有很多,如果要详细了解的话最好去官方网站,地址是http://www.imagemagick.org/script/command-line-options.php
批量替换
for img in `find ./ -name "*.[jJ][pP][gG]"`; do convert -resize 85%*85% $img $img-resized; rm $img; mv $img-resized $img echo $img done for img in `find ./ -name "*.[pP][nN][gG]"`; do convert -resize 85%*85% $img $img-resized; rm $img; mv $img-resized $img echo $img done for img in `find ./ -name "*.[gG][iI][fF]"`; do convert -resize 85%*85% $img $img-resized; rm $img; mv $img-resized $img echo $img done
这一次跑的脚本 压缩所有宽或高大于1000像素的图片 压缩效果 从3m能压缩到500kb左右
for img in `find ./ -name "*.[jJ][pP][gG]"`; do convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img done for img in `find ./ -name "*.[pP][nN][gG]"`; do convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img done for img in `find ./ -name "*.[gG][iI][fF]"`; do convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img done
PS
昨天在使用的时候 发现 linux shell 处理文件的时候 如果有空格 会认为是两个文件,这里 兼容下这个问题
#!/bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") for img in `find /web/wwwroot/www.dazugongyi.org/ -name "*.[jJ][pP][gG]"`; do if [[ $img =~ " " ]] then echo $img echo "has blank" else convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img fi done for img in `find /web/wwwroot/www.dazugongyi.org/ -name "*.[pP][nN][gG]"`; do if [[ $img =~ " " ]] then echo $img echo "has blank" else convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img fi done for img in `find /web/wwwroot/www.dazugongyi.org/ -name "*.[gG][iI][fF]"`; do if [[ $img =~ " " ]] then echo $img echo "has blank" else convert -resize "1000x1000>" $img $img-resized; rm $img; mv $img-resized $img echo $img fi done IFS=$SAVEIFS