ImageMagick Thumbnails and Contact Sheets

March 30, 2009

Update (2010-06-14)
Thanks to Glenn Turnbull I’ve fixed a bug where the last contact sheet would not be created when the number of photos is evenly divisible by the contact sheet size.

Additionally, this script and others will now be kept updated at http://github.com/jmhobbs/helper-scripts

Update (2012-04-10)
Phillip Vuchetich wrote a neat script for making composite 4×6 out of wallet sized images, which he has allowed me to post about here.

Wow, long time no post. Darcy and I got a digital camera about a week ago, a Nikon D90. We haven’t really had a chance to put it through it’s paces, but we’ve taken a few pictures around the house to play with it.

At about 3mb each (JPEG’s) the images are really slow to preview in Konqueror. I decided it would be better to be able to download all the photos from the card, then run a script to make my thumbnails. That way I wouldn’t have to wait around while I was viewing photos, instead I could just wait once at the beginning of the process.

My resulting script may have some holes, but it works well for me on Sidux. It takes all of the images in the current directory and makes 600×600 base thumbnails into a directory called “thumb” then uses those to make 12 image contact sheets into a directory called “contact”.

realusersys
resize0m43.478s0m40.625s0m2.525s
scale0m25.449s0m22.975s0m2.236s
sample0m18.362s0m15.983s0m2.211s
Script times for 16 JPEG images at 3Mb each
To 600×600 thumbnails and 200×200 contact sheet frames.

Your results will vary, but I ran it with three different scaling types (resize, scale, sample). I’m fine with the output from the fastest one (sample) but you can do as you please. I didn’t add command line options because I wanted to have consistent sizes and qualities every time I use it.


Side By Side Resize Method Comparison
Click For Fullsize

Sample Contact Sheet
Click For Full Size

It keeps you updated so you know it hasn’t stalled, here is a sample run.

jmhobbs@asuka:~/Desktop/D90/dcim/example$ digiCamProc.sh
Processing 16 Images
 
Creating Thumbnails
100%
 
Creating Contact Sheets
1 of 2
2 of 2
jmhobbs@asuka:~/Desktop/D90/dcim/example$

And here it is. Feel free to comment your changes!

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
#!/bin/bash
 
# Digital camera thumbnail/contact sheet tool.
# http://www.velvetcache.org/2009/03/30/imagemagick-thumbnails-and-contact-sheets
# http://github.com/jmhobbs/helper-scripts
#
# Copyright (c) 2009-2010 John Hobbs
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
 
# CHANGELOG
# 2010-06-14 - Fixed contact sheet problem, thanks to Glenn Turnbull. (John Hobbs)
# 2009-03-30 - Created script. (John Hobbs)
 
### SETTINGS ###
 
# Scaling Methods:
# resize (Best/Slow)
# scale (Middle/Middle)
# sample (Worst/Fast)
METHOD="sample"
 
# Thumbnail Size
THUMBSIZE="600x600"
# Thumbnail Directory
THUMBDIR="thumb"
# Thumbnail Quality
THUMBQUALITY="80"
 
# Contact Item Size
CONTACTSIZE="200x200"
# Contact Sheet Max Width
CONTACTWIDTH="3"
# Contact Sheet Max Height
CONTACTHEIGHT="4"
# Horizontal Spacing
CONTACTSPACINGH="3"
# Vertical Spacing
CONTACTSPACINGV="3"
# Contact Sheet Directory
CONTACTDIR="contact"
# Contact Sheet Quality
CONTACTQUALITY="100"
 
################
 
 
CONTACTCOUNT=$(($CONTACTWIDTH * $CONTACTHEIGHT))
PIX=$(ls -l *.jpg | wc -l)
 
echo "Processing $PIX Images"
echo
echo "Creating Thumbnails"
 
mkdir -p $THUMBDIR
CTR=0
echo -n "0%"
for i in *.jpg; do
    echo -ne "\r"
    echo -n "$((100 * $CTR / $PIX))%"
    convert -strip -quality ${THUMBQUALITY} -${METHOD} ${THUMBSIZE} "$i" "${THUMBDIR}/${i}"
    CTR=$(($CTR + 1))
done
 
echo -ne "\r"
echo "100%"
 
echo
echo "Creating Contact Sheets"
 
mkdir -p $CONTACTDIR
CTR=0
PAGES=$(($PIX / $CONTACTCOUNT))
if [ $(($PIX % $CONTACTCOUNT)) -ne 0 ]; then
    PAGES=$(($PAGES + 1))
fi
 
PAGE=1
LIST=""
for i in ${THUMBDIR}/*.jpg; do
    if [ $(($CTR % $CONTACTCOUNT)) -eq 0 ] && [ $CTR -ne 0 ]; then
        echo "$PAGE of $PAGES"
        montage -label %f -quality $CONTACTQUALITY -frame 5 -tile ${CONTACTWIDTH}x${CONTACTHEIGHT} -geometry ${CONTACTSIZE}+${CONTACTSPACINGH}+${CONTACTSPACINGV} $LIST jpg:- > ${CONTACTDIR}/${PAGE}.jpg
        LIST=""
        PAGE=$(($PAGE + 1))
    fi
    LIST="$LIST $i"
    CTR=$(($CTR + 1))
done
 
if [ "" != "$LIST" ]; then
    echo "$PAGE of $PAGES"
    montage -label %f -quality $CONTACTQUALITY -frame 5 -tile ${CONTACTWIDTH}x${CONTACTHEIGHT} -geometry ${CONTACTSIZE}+${CONTACTSPACINGH}+${CONTACTSPACINGV} $LIST jpg:- > ${CONTACTDIR}/${PAGE}.jpg
fi
Categories: Geek
Tags: , , , ,

Comments

  1. Thanks a lot! You saved me the time and effort. I’m very happy with my contact sheet.

  2. Phillip Vuchetich says:

    Thanks for this script – I plan to tweak the script setting slightly to make it easier to montage 4 photos into a single image file so we can have a 4×6 printed with 4 different wallets for scrapbooking.

    Why? All of the local photo printing companies will only print a 4×6 with 4 identical wallet photos, and charge about 5-10 times the price of a 4×6…and we only need one of the 4 prints anyway. We’ve printed wallets on an inkjet, but the store photos look a little better.

  3. John Hobbs says:

    I’ve done the same trick myself in the past, I made a set of magnets for a Christmas present and I just arranged all the photos on one 4×6. Hope it works out for you!

  4. […] > ${CONTACTDIR}/${PAGE}.jpg fi Categories: Geek Tags: BASH, Programming, ScriptRelated Posts2009-03-30ImageMagick Thumbnails and Contact Sheets 2007-05-24Disappointed In SimpleXML 2007-11-30HowTo’s 2006-10-02Handling Forms With PHP […]

  5. I love this, fits the bill, and it is just what I needed without having to download some huge binary. Thanks!

  6. […] that you have ImageMagick up and running, visit this site: http://www.velvetcache.org/2009/03/30/imagemagick-thumbnails-and-contact-sheets and save out the bash script there as something like “thumbnail.sh”. One way to do that is to […]

Leave A Comment

Your email will not be published.