The Need
Today I started putting together a little image gallery for my sideburns and I really wanted a way to easily scale a directory of images to a specific height, save the result in a directory and then repeat the process and save in yet another directory.
The Solution
There is probably an easy way to do what I want using GIMP, but I thought it would be better if I wrote a script to handle this for me. Technically, the script that I wrote is just a fancy wrapper for the imagemagick convert command.
Enter the Ruby
#create a function to end the script with a message
def exit_help(message=nil)
#did a message get passed in?
if !message.nil?
#print the message
puts message
end
#print the 'help'
puts "--Help--
#{$0} path/to/image/directory thumbnail_height image_height
"
exit()
end
#make a function to create a dir if it doesn't exist
def check_dir(dir)
if !File.directory?( dir )
Dir.mkdir(dir)
end
end
#make a function to run a set command
def do_command(comm)
puts comm
system(comm)
end
#set some variable based on the input from the user
start_dir = ARGV[0]
thumb_height = ARGV[1].to_i
image_height = ARGV[2].to_i
#if any of the vars aren't set, the user didn't input enough info
if start_dir.nil? or thumb_height==0 or image_height==0
exit_help()
end
#does the start dir exist?
if !File.directory?( start_dir )
exit_help( "#{start_dir} does not exist" )
end
# define the output dirs
gallery_dir = File.join(start_dir,'gallery')
thumb_dir = File.join(start_dir,'gallery_thumbs')
# make the dirs if they don't exist
check_dir(gallery_dir)
check_dir(thumb_dir)
#loop through the files in the start_dir
start_dir_files = File.join(start_dir,"*.{png,jpg}")
Dir.glob(start_dir_files) do |file|
#what is the name of the file?
fname = File.basename(file)
#what is the path of the new gallery file?
gfile = File.join(gallery_dir,fname)
#what is the path of the new thumbnail file?
tfile = File.join(thumb_dir,fname)
#what imagemagick commands will resize the images?
c1 = "convert -resize x#{image_height} #{file} #{gfile}"
c2 = "convert -resize x#{thumb_height} #{file} #{tfile}"
#run the commands
do_command( c1 )
do_command( c2 )
end
What It Do?
I'll tell you what it do! When run, the script requires three arguments: 1. The name of the directory containing the images 2. the height of the thumbnail image 3. the height of the gallery image
The end result will be a directory named "gallery" and a directory named "gallery_thumbs" in the images directory. Gallery will contain the images resized to the gallery height specifications. I'll leave it to you to figure out what images are in the "gallery_thumbs" directory.
My Take Away
Originally, I had planned on using the exec() function to run my convert commands but exec() replaces the calling script with the command being called. This means that as soon as I ran exec(), my code would quit running. Oh well, system() works just fine for my needs.