#!/usr/bin/perl -w # # Written by Travis Kent Beste # Thu Aug 16 10:37:10 CDT 2007 # # $Id: create_thumbnail.pl,v 1.3 2007/08/21 15:45:13 travis Exp $ # $Source: /cvs_repository/thumbnails/create_thumbnail.pl,v $ use strict; use Data::Dumper; use Image::Magick; use Getopt::Std; $|++; my %opts; getopts('f:w:dhi', \%opts); #----------------------------------------# # main #----------------------------------------# my $filename = $opts{'f'} || ''; my $width = $opts{'w'} || 120; my $debug = $opts{'d'} || 0; my $info = $opts{'i'} || 0; my $help = $opts{'h'} || 0; if ($help) { usage(); } if ($info) { if (! -e $filename) { usage(); } my $image = Image::Magick->new(magick=>'JPEG'); my $x = $image->Read($filename); printf "\twidth : %d\n", $image->Get('width'); printf "\theight : %d\n", $image->Get('height'); exit; } # thumbnail width we're going for my $projected_width = $width; # the width that we're shooting for my $projected_error = 20; # the margin of error to check for print "projected_width : $projected_width\n"; print "projected_error : $projected_error\n"; if (! -e $filename) { opendir(DIR, './'); my @files = sort grep(/jpg$/i, readdir(DIR)); closedir(DIR); foreach my $filename (@files) { if ( ($filename !~ /\.small\./) && ($filename !~ /\.thumb\./) ) { process_file($filename, $debug); } } } else { process_file($filename, $debug); } exit(0); #----------------------------------------# # subroutines #----------------------------------------# sub usage { print "Usage: $0\n"; print "\t-d : debug\n"; print "\t-w : width of final image requested\n"; print "\t-f : file, defaults to reading directory for files ending with '.jpg'\n"; print "\t-i : info, you'll need to supply -f\n"; print "\t-h : help, this menu\n"; exit(0); } sub get_divisor { my $width = shift; my $divisor = 0; my $prev = $width; my $issue = 0; for(my $i = 1; $i < 20; $i++) { if ( ($width / $i) < ($projected_width + $projected_error) && ($width / $i) > ($projected_width - $projected_error) ) { return $i; } if ( ($prev - ($width/$i)) > 200) { $issue = 1; } $prev = $width/$i; if ($debug) { printf "%3d - %4d %4d %4d\n", $i, $projected_width + $projected_error, ($width/$i), $projected_width - $projected_error; } } if ($issue == 1) { return get_float_divisor($width); } } sub get_float_divisor { my $width = shift; my $divisor = 0; my $prev = $width; my $issue = 0; for(my $i = 1; $i < 5; $i++) { for(my $j = 0; $j < 10; $j++) { my $divisor = sprintf("%d.%d", $i, $j); print "$divisor\n"; if ( ($width / $divisor) < ($projected_width + $projected_error) && ($width / $divisor) > ($projected_width - $projected_error) ) { return $divisor; } if ($debug) { printf "%3d - %4d %4d %4d\n", $i, $projected_width + $projected_error, $width/$divisor, $projected_width - $projected_error; } } } } sub process_file { my $filename = shift; my $debug = shift; my $thumbnail = $filename; print "inspecting $filename...\n"; $thumbnail =~ s/\.jpg//i; $thumbnail .= '.small.jpg'; if (! -e $thumbnail) { print "processing $filename...\n"; my $image = Image::Magick->new(magick=>'JPEG'); my $x = $image->Read($filename); printf "\twidth : %d\n", $image->Get('width'); printf "\theight : %d\n", $image->Get('height'); my $divisor = get_divisor($image->Get('width')); printf "\tdivisor : %5.2f\n", $divisor; my $scaled_width = sprintf("%d", $image->Get('width') / $divisor); printf "\tscaled_width : $scaled_width\n"; my $scaled_height = sprintf("%d", $image->Get('height') / $divisor); printf "\tscaled_height : $scaled_height\n"; # scale the image $x = $image->Scale(width=>$scaled_width, height=> $scaled_height); # write the thumbnail $x = $image->Write($thumbnail); } else { print "thumbnail exists...\n"; } # move the uppercase to lowercase for '.jpg' if ($filename =~ /JPG$/) { my $new = $filename; my $old = $filename; $new =~ s/\.JPG/\.jpg/; printf "\tmv $old $new"; system("mv $old $new"); } print "Done.\n"; }