2 title: gify.sh – back to bash scripting
5 date: 2016-01-25T12:41:06+00:00
6 featured_image: /uploads/2016/01/G0092546.jpg
20 {{< figure src="/uploads/2016/01/piscaturi.gif" alt="piccoli pescatori crescono" caption="gif image created using gify.sh" class="align-center" >}}
22 Today I'll present you a useful script that will help you create amazing gifs from your still photos using a couple tools from the [IMAGEMAGIK](https://www.imagemagick.org) suite, so without further ado, here it is, straight from github's gists.
24 {{< actions url="https://gist.github.com/danixland/624f77c70c9e19ce7cf9/archive/26746be7f7009f82e4246a8bc0e5728954d0ac8b.zip" desc="Download as ZIP archive" outclass="special" inclass="primary" >}}
27 what the code does is quite simple, it takes a few arguments and helps you resize your images while keeping the original proportions. Put the code in your path and let's put it to work.
31 For this example we'll pretend you have a bunch of jpg pictures, maybe something you shot while travelling france, put them in a folder and run the script like this:
34 gify.sh --resize 900 jpg
37 depending on the amount of images it may take a while, and when it's done you'll have all of your jpg resized to 900px wide and with proportional height.
39 now it's time to render all of your jpg into one animated gif so, while in the same directory, run the script like this:
42 gify.sh --gif 10 jpg paris
45 the parameters now are a bit different, first we tell the script that we want to create a gif with the `--gif` option, then we tell the interval between every frame, that number is expressed in 100th of a second, so now we are telling the gif to change frame every 10/100 of second, the following parameter is the extension of the images we'll be using, in our example is jpg (it's case sensitive, so make sure all the images you want to use have the same extension), and finally we set the name of the gif, without the extension, the script will provide it for us.
47 The gif you see at the beginning of the article was created with this script.
49 I made this script mostly for fun and personal use, so it's absolutely not idiot proof, can be improved but for me it works just fine. If you want to modify it, feel free to fork it on github or just download it and do whatever you like with it, and if you want to share it with me, use the comment form below.
51 I'll leave you with a copy of the script here in case you want to have a look at it before downloading.
54 {{< highlight bash "linenos=true" >}}#! /bin/bash
56 # Author: Danilo 'danix' Macri
57 # Author URI: https://danix.xyz
58 # Script URI: https://danix.xyz/?p=3545
60 # License URI: https://www.gnu.org/licenses/gpl-2.0.html
62 #--------------------------------------------------------------------------------#
64 # GIFY.SH - CREATE ANIMATED GIFS OUT OF A BUNCH OF IMAGES #
66 # Use this script to create animated looping gifs from a bunch of images. You #
67 # just need to arrange all the images you want to use inside a folder and then #
68 # launch this script with a few options and you'll have your gif within seconds. #
70 # This script uses mogrify and convert from the IMAGEMAGIK suite to deliver the #
71 # gifs. This script can proportionally resize your images to help you create a #
74 #--------------------------------------------------------------------------------#
76 # ERROR & EXIT STATUSES #
89 MOGRIFY=$(which mogrify)
90 CONVERT=$(which convert)
92 # we need mogrify and convert from the imagemagik toolset for this script to work #
93 if [[ ! -x $MOGRIFY || ! -x $CONVERT ]]; then
104 echo "USAGE: $(basename $0) -r | --resize [width] [extension]"
107 echo "USAGE: $(basename $0) -g | --gif [delay] [extension] [output file name]"
110 #|----------------------- TEXT MAX WIDTH - 80 CHARS ----------------------------|
111 echo -e "$(basename $0) - create animated gifs from images inside current directory"
112 echo -e "USAGE: $(basename $0) <option> [arguments]"
113 echo -e "\twhere <option> is one between:";echo
114 echo -e "\t-r | --resize [width] [extension]"
115 echo -e "\t\tresizes all the images matching the extension in the current folder to"
116 echo -e "\t\tthe width specified as argument.";echo
117 echo -e "\tg | --gif [delay] [extension] [output file name]"
118 echo -e "\t\tcreates the gif file using all the images in the current folder."
121 echo -e "$(basename $0) --resize 900 jpg"
122 echo -e "\twill resize all jpg images in the folder to 900px wide and mantain the"
123 echo -e "\taspect ratio of the original images"
125 echo -e "$(basename $0) --gif 8 jpg france"
126 echo -e "\twill create a looping gif named france.gif using all the jpg files found"
127 echo -e "\tin the current folder and passing a tick delay of 8 between frames".
136 if [ -z $1 ];then
137 echo "INTERNAL ERROR - ABORTING"; echo
142 echo "unknown option. Exiting."; echo
145 echo "you didn't specify any options for the script to run. Exiting."; echo
148 echo "you didn't specify any arguments for this option. Exiting."; echo
151 echo "the file you want to write already exists. Exiting."; echo
154 echo "at least two files must exist within $PWD with the"
155 echo "specified extension. Exiting"; echo
158 echo "$(basename $0) requires both mogrify and convert from"
159 echo "the imagemagik tool suite. Install imagemagik using your"
160 echo "favourite package manager and then run this script again. Exiting."; echo
165 if [ $# -eq 0 ];then
171 while [ $# -gt 0 ];do
181 if [[ -z $WIDTH || -z $EXT ]];then
186 IMAGES="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
187 if [[ $IMAGES == 0 ]]; then
192 COUNT="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
193 echo "you're going to resize all $COUNT .$EXT images inside $PWD at a fixed width of ${WIDTH}px"
194 read -p "do you wish to continue? [y/n] " -n 1 -r; echo
195 if [[ ! $REPLY =~ ^[Yy]$ ]]
199 $MOGRIFY -resize $WIDTH *.$EXT
208 if [[ -z $DELAY || -z $EXT || -z $OUTPUT ]];then
212 elif [[ -f ${OUTPUT}.gif ]]; then
216 IMAGES="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
217 if [[ $IMAGES == 0 ]]; then
222 COUNT="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
223 echo "you're going to create a looping gif named ${OUTPUT}.gif"
224 echo "out of all the $COUNT $EXT files inside $PWD with a tick"
225 echo "delay of $DELAY/100 of a second"; echo
226 read -p "do you wish to continue? [y/n] " -n 1 -r; echo
227 if [[ ! $REPLY =~ ^[Yy]$ ]]
231 $CONVERT -delay $DELAY *.$EXT -loop 0 ${OUTPUT}.gif