1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
+++
title = "gify.sh – back to bash scripting"
author = "Danilo M."
type = "tech"
date = "2016-01-25T12:41:06+00:00"
image = "/uppies/2016/01/G0092546.jpg"
categories = ["code", "diy", "fotografia"]
tags = ["bash", "convert", "gif", "imagemagik", "mogrify", "script"]
+++
{{< image class="max-w-lg mx-auto" src="piscaturi.gif" alt="piccoli pescatori crescono" caption="gif image created using gify.sh" >}}
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.
{{< actions url="https://gist.github.com/danixland/624f77c70c9e19ce7cf9/archive/26746be7f7009f82e4246a8bc0e5728954d0ac8b.zip" desc="Download as ZIP archive" outclass="special" inclass="primary" >}}
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.
<!--more-->
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:
```bash
gify.sh --resize 900 jpg
```
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.
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:
```bash
gify.sh --gif 10 jpg paris
```
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.
The gif you see at the beginning of the article was created with this script.
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.
I'll leave you with a copy of the script here in case you want to have a look at it before downloading.
Enjoy!
{{< highlight bash "linenos=true" >}}#! /bin/bash
# Author: Danilo 'danix' Macri
# Author URI: https://danix.xyz
# Script URI: https://danix.xyz/?p=3545
# License: GPL2
# License URI: https://www.gnu.org/licenses/gpl-2.0.html
#--------------------------------------------------------------------------------#
# #
# GIFY.SH - CREATE ANIMATED GIFS OUT OF A BUNCH OF IMAGES #
# #
# Use this script to create animated looping gifs from a bunch of images. You #
# just need to arrange all the images you want to use inside a folder and then #
# launch this script with a few options and you'll have your gif within seconds. #
# #
# This script uses mogrify and convert from the IMAGEMAGIK suite to deliver the #
# gifs. This script can proportionally resize your images to help you create a #
# lighter file. #
# #
#--------------------------------------------------------------------------------#
# ERROR & EXIT STATUSES #
SHOWHELP=61
USERABORTED=62
E_INTERROR=71
E_NOOPTS=72
E_NOARGS=73
E_FILEXISTS=74
E_NOIMAGES=75
E_UNKNOWNOPT=76
# TOOLS #
PWD=$(pwd)
MOGRIFY=$(which mogrify)
CONVERT=$(which convert)
# we need mogrify and convert from the imagemagik toolset for this script to work #
if [[ ! -x $MOGRIFY || ! -x $CONVERT ]]; then
showerror missingdeps
exit $E_MISSINGDEPS
fi
# showhelp #
showhelp ()
{
case $1 in
resize )
echo "USAGE: $(basename $0) -r | --resize [width] [extension]"
;;
gif )
echo "USAGE: $(basename $0) -g | --gif [delay] [extension] [output file name]"
;;
* )
#|----------------------- TEXT MAX WIDTH - 80 CHARS ----------------------------|
echo -e "$(basename $0) - create animated gifs from images inside current directory"
echo -e "USAGE: $(basename $0) <option> [arguments]"
echo -e "\twhere <option> is one between:";echo
echo -e "\t-r | --resize [width] [extension]"
echo -e "\t\tresizes all the images matching the extension in the current folder to"
echo -e "\t\tthe width specified as argument.";echo
echo -e "\tg | --gif [delay] [extension] [output file name]"
echo -e "\t\tcreates the gif file using all the images in the current folder."
echo
echo -e "EXAMPLES:"
echo -e "$(basename $0) --resize 900 jpg"
echo -e "\twill resize all jpg images in the folder to 900px wide and mantain the"
echo -e "\taspect ratio of the original images"
echo
echo -e "$(basename $0) --gif 8 jpg france"
echo -e "\twill create a looping gif named france.gif using all the jpg files found"
echo -e "\tin the current folder and passing a tick delay of 8 between frames".
echo
;;
esac
}
# showerror #
showerror ()
{
if [ -z $1 ];then
echo "INTERNAL ERROR - ABORTING"; echo
exit $E_INTERROR
fi
case $1 in
unknownopt)
echo "unknown option. Exiting."; echo
;;
noopts)
echo "you didn't specify any options for the script to run. Exiting."; echo
;;
noargs)
echo "you didn't specify any arguments for this option. Exiting."; echo
;;
filexists)
echo "the file you want to write already exists. Exiting."; echo
;;
noimages)
echo "at least two files must exist within $PWD with the"
echo "specified extension. Exiting"; echo
;;
missingdeps)
echo "$(basename $0) requires both mogrify and convert from"
echo "the imagemagik tool suite. Install imagemagik using your"
echo "favourite package manager and then run this script again. Exiting."; echo
esac
}
##### MAIN #####
if [ $# -eq 0 ];then
showerror noopts
showhelp
exit $E_NOOPTS
else
while [ $# -gt 0 ];do
case $1 in
-h|--help)
showhelp
exit $SHOWHELP
;;
-r|--resize)
WIDTH=$2
EXT=$3
shift
if [[ -z $WIDTH || -z $EXT ]];then
showhelp resize
showerror noargs
exit $E_NOARGS
fi
IMAGES="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
if [[ $IMAGES == 0 ]]; then
showerror noimages
exit $E_NOIMAGES
fi
clear
COUNT="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
echo "you're going to resize all $COUNT .$EXT images inside $PWD at a fixed width of ${WIDTH}px"
read -p "do you wish to continue? [y/n] " -n 1 -r; echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
exit $USERABORTED
else
$MOGRIFY -resize $WIDTH *.$EXT
exit 0
fi
;;
-g|--gif)
DELAY=$2
EXT=$3
OUTPUT=$4
shift
if [[ -z $DELAY || -z $EXT || -z $OUTPUT ]];then
showhelp gif
showerror noargs
exit $E_NOARGS
elif [[ -f ${OUTPUT}.gif ]]; then
showerror filexists
exit $E_FILEXISTS
fi
IMAGES="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
if [[ $IMAGES == 0 ]]; then
showerror noimages
exit $E_NOIMAGES
fi
clear
COUNT="$(ls -1 *.$EXT 2>/dev/null | wc -l)"
echo "you're going to create a looping gif named ${OUTPUT}.gif"
echo "out of all the $COUNT $EXT files inside $PWD with a tick"
echo "delay of $DELAY/100 of a second"; echo
read -p "do you wish to continue? [y/n] " -n 1 -r; echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
exit $USERABORTED
else
$CONVERT -delay $DELAY *.$EXT -loop 0 ${OUTPUT}.gif
exit 0
fi
;;
*)
showerror unknownopt
showhelp
exit $E_UNKNOWNOPT
esac
shift
done
fi
{{< /highlight >}}
|