zoukankan      html  css  js  c++  java
  • 凝结时光: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
  • 相关阅读:
    用 js 的 selection range 操作选择区域内容和图片
    jQuery / zepto ajax 全局默认设置
    transform-origin 的定位
    JS和CSS中引号的使用
    JS里引用CSS属性时候的命名
    nodeName,nodeValue,nodeType,typeof 的区别
    我的前端之路启程了
    This dependency was not found: * components/Header in ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/pages/Index.vue报错!
    font-face字体图标
    给多个元素绑定事件
  • 原文地址:https://www.cnblogs.com/YFYkuner/p/4278983.html
Copyright © 2011-2022 走看看