凝结时光:ImageMagick 制作 gif
从去年12.12开始,工作日都会从单位的落地窗向外拍一张照片,有点每日打卡的意思。weekday 是一天不落的,weekend 不是每次都到单位,落了几次。
想法来自上学的时候,有同学在同一个地方,拍北洋广场的一年四季,做成 gif,非常漂亮。自己就也想试一下,于是就动手了。
干货开始。
工具:shell、ImageMagick
1、照片采集
手机拍摄,上传网盘。
2、照片整理
1 # 准备目录 2 workDir=gifs 3 mkdir $workDir 4 mkdir -p $workDir/imgs 5 mkdir -p $workDir/minImgs 6 7 # 准备文件 8 cd $workDir 9 cp ~/Downloads/aaa/*.jpg imgs/
3、文件名处理
这个是一个特殊的情况,iPhone 拍出来的照片,传到网盘后,文件名是“2014-12-31 084045.jpg”,中间有个空格,在处理的时候有点麻烦,需要把空格处理掉。
1 cd imgs 2 for f in `find *.jpg | tr ' ' '_'` 3 do 4 mv "`echo $f | tr '_' ' '`" $f 5 done
4、图片加水印
这里我想的是右上角加上日期的标签,内容可以从文件名里面截取:
水印的坐标需要根据图片的实际情况去设置,对 ImageMagick 用的不多,还没有掌握相对坐标的方式(如果有的话)。
1 # 当前目录 $workDir/imgs 2 3 for f in `ls . | grep jpg` 4 do 5 echo "current img: "$f 6 wm_file=${f:0:10}.jpg 7 wm_text=${f:0:10} 8 echo "water mark: "$wm_text 9 convert -fill white -pointsize 96 -draw "text 2700,160'$wm_text'" $f $wm_file 2> ../log 10 rm $f 11 done
5、图片压缩
原始的图片太大,可以适当压缩下:
DPI 设置为400,压缩成原来的25%
1 # 当前目录 $wordDir/imgs 2 3 for f in `ls . | grep jpg` 4 do 5 convert -density 400 -geometry 25% $f ../minImgs/$f
6 done 7 8 cd $workDir
6、合成 gif
这里 imageMagick 默认的一个 tick 是1/100s,这里50个 tick,就是50/100,就是半秒。可以根据自己的需求,多试几次。
1 # 当前目录 $workDir 2 3 convert -delay 50 minImg/*.jpg res.gif 2>>log
最后,上结果。
(超过10M 了 T T)
http://pan.baidu.com/s/1sjuizQP
附全部代码:
1 #!/bin/sh 2 if [[ $# != 1 ]] 3 then 4 echo "Usage: sh makeGif.sh srcDir" 5 exit 1 6 fi 7 8 SRCDIR=$1 9 WORKDIR=gifs 10 mkdir $WORKDIR 11 mkdir -p $WORKDIR/imgs 12 mkdir -p $WORKDIR/minImgs 13 14 # 准备文件 15 cd $WORKDIR 16 cp $SRCDIR/*.jpg imgs/ 17 18 cd imgs 19 for f in `find *.jpg | tr ' ' '_'` 20 do 21 mv "`echo $f | tr '_' ' '`" $f 22 done 23 24 # 当前目录 $WORKDIR/imgs 25 26 for f in `ls . | grep jpg` 27 do 28 echo "current img: "$f 29 wm_file=${f:0:10}.jpg 30 wm_text=${f:0:10} 31 echo "water mark: "$wm_text 32 convert -fill white -pointsize 96 -draw "text 2700,160'$wm_text'" $f $wm_file 2> ../log 33 rm $f 34 done 35 36 # 当前目录 $wordDir/imgs 37 38 for f in `ls . | grep jpg` 39 do 40 convert -density 400 -geometry 25% $f ../minImgs/$f.jpg 41 done 42 43 cd .. 44 45 # 当前目录 $WORKDIR 46 47 convert -delay 50 minImgs/*.jpg res.gif 2>>log