#!/usr/bin/perl # # # [make-thumbs.pl] 2002-03-14 René Scholz <Voland@Jena.Thur.de> # # Time-stamp: <2002-03-15 21:19:35, rscholz@jpiros.rnd.j.intershop.de> # # # Usage: - creates thumbnail pics with convert (ImageMagick), if file is group-readable # - creates a html file with a <DIV> area for the thumbnail pics # which can be included in html pages via SSI with: # <!--#include file="include.thumbs"--> # - different image types can be used # - the images are sorted alphabetically # ################################################################################# ($NAME=$0) =~ s|.*/||; # get basename from $0 use Getopt::Std; use vars qw($NAME $USAGE $opt_n $opt_h $opt_x $opt_y $opt_e $opt_o $opt_s $opt_t $opt_f $opt_c $opt_r $pic $picext $miniext @PICFILES %TYPES $GEOMETRY $OUTPUT $OUTFILE $i $alt $height $width $colors $img $groupreadble $minspace $vspace $hspace $maxwidth %MINIWIDTH %MINIHEIGHT %MINIEXT); use strict; $USAGE=<<EOUSAGE; Usage: $NAME [options] Options: -h Show this help. -n pics How many thumbs in each row -s pixel minimal horizontal and vertical space (in pixels*2) -e ext[,ext,...] allowed image types (Ex: -e jpg,gif,png) -t ext image type for the thumnail pics (Ex: -t jpg) If -t is not used, the thumnails have the same type as the original image -o Overwrite existing thumbnail files. -x width of thumbnails -y height of thumbnails Only one of the options -x or -y should be used (Ex: -y 100 so that all thumbnails have the same height) -c colors Number of colors in the thumbnail to use -f file output file name (default: include.thumbs) -r regex Search only matching image file names, ex: -r "Town*" EOUSAGE die $USAGE unless(@ARGV); getopts('hn:s:e:f:x:y:c:t:or:'); die $USAGE if($opt_h); if($opt_e) { foreach (split(",", $opt_e)) { $TYPES{$_} = 1; } } else { %TYPES = ( "jpg" => 1 ) }; $minspace = $opt_s ? $opt_s : "5"; $colors = $opt_c ? "-colors $opt_c" : ""; $vspace = "vspace=\"$minspace\""; $OUTFILE = $opt_f ? $opt_f : "include.thumbs"; $OUTPUT = "<DIV align=\"center\">\n"; if(-f ".geometry-mini") { $GEOMETRY = `cat .geometry-mini`; chomp($GEOMETRY); $GEOMETRY = "x100" if($GEOMETRY eq ""); } if ($opt_x && $opt_y) { $GEOMETRY = $opt_x . "x" . $opt_y . "!"; } elsif($opt_x) { $GEOMETRY = $opt_x; } elsif($opt_y) { $GEOMETRY = "x" . $opt_y; } else { $GEOMETRY = "x100"; } # get files which should be handled: opendir(CDIR, ".") || die "Cant't open current directory $!\n"; while(defined($pic = readdir CDIR)) { next if ($pic eq '.' || $pic eq '..'); if( $pic =~ /\.([^\.]+)$/ ) { $picext = $1; } else { $picext = ""; } if(exists($TYPES{$picext})) { if(!$opt_r || $pic =~ /$opt_r/) { push(@PICFILES, $pic); } } } closedir(CDIR); # work on this files: $maxwidth = 0; foreach $pic (@PICFILES) { my ($E); $_ = $pic; if( /\.([^\.]+)$/ ) { $picext = $1; } else { $picext = ""; } $miniext = $opt_t ? $opt_t : $picext; next if(/\.mini\.$miniext$/); s/\.$picext$/.mini.$miniext/; # check if file is group readable (that means, the webserver can read it) # if not, do nothing with this file, do not include it in the output. $groupreadble = (stat $pic)[2] & 040; next unless($groupreadble); if(! -f $_ or $opt_o) { print "executing: convert $colors -geometry '$GEOMETRY' $pic $_\n"; system "convert $colors -geometry '$GEOMETRY' $pic $_"; } $E=`identify $_`; # print " -> $E"; $E=~/ (\d+)x(\d+) /; $width = $1; $height = $2; $width+=1 if($width % 2 != 0); $maxwidth = $width if($maxwidth < $width); $MINIWIDTH{$pic} = $width; $MINIHEIGHT{$pic} = $height; $MINIEXT{$pic} = $miniext; } $i = $alt = 1; foreach $pic (sort keys %MINIWIDTH) { $_ = $pic; if( /\.([^\.]+)$/ ) { $picext = $1; } else { $picext = ""; } $miniext = $MINIEXT{$pic}; s/\.$picext$/.mini.$miniext/; $width = $MINIWIDTH{$pic}; $height = $MINIHEIGHT{$pic}; $hspace = ($maxwidth - $width) / 2 + $minspace; $hspace = "hspace=\"$hspace\""; $img = "ALT=\"$alt\" HEIGHT=\"$height\" WIDTH=\"$width\" BORDER=\"1\" $vspace $hspace"; $OUTPUT.=" <A HREF=\"$pic\"><IMG src=\"$_\" $img></A>\n"; if($i++ >= $opt_n) { $OUTPUT.=" <BR clear=\"all\">\n"; $i = 1; } $alt++; } $OUTPUT.="</DIV>\n"; open (O, ">$OUTFILE") or die "Can't write to $OUTFILE: $!\n"; print O $OUTPUT; close (O);