File:  [Repository] / scaleomat / scaleomat.pl
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Fri Jul 23 18:00:33 2004 UTC (19 years, 10 months ago) by casties
Branches: MAIN
CVS tags: HEAD
new version

    1: #!/usr/bin/perl
    2: 
    3: use strict;
    4: 
    5: # MPIWG libraries
    6: use lib '/usr/local/mpiwg/scripts';
    7: use MPIWGlib;
    8: 
    9: 
   10: $| = 1; # unblock IO
   11: 
   12: my $version = "V0.9.2 (ROC 22.4.2004)";
   13: 
   14: $debug = 0;
   15: 
   16: my $simulate = 0;
   17: 
   18: my $do_descend = 1;
   19: 
   20: my $dir_perm = 0775;
   21: my $file_perm = 0664;
   22: 
   23: umask 000; # to make shure we can actually use these perms
   24: 
   25: my $overwrite = 0; # overwrite already converted files
   26: 
   27: # image file extensions and formats
   28: my %img_type_ext = ("tif" => "TIFF", "tiff" => "TIFF", "gif" => "GIF", 
   29: 		"jpg" => "JPEG", "png" => "PNG");
   30: # destination image file extensions
   31: my %target_ext_type = ("TIFF" => "jpg", "JPEG" => "jpg");
   32: 
   33: # default scale settings
   34: my $scalesize = 2048; # pixel of longest side
   35: my $scale_relative = 0; # scale by relative factor instead of destination size
   36: my $jpeg_quality = 75; # default JPEG compression quality
   37: my $use_encoder = 0; # autodetect encoder
   38: 
   39: # programs to use
   40: my $identifier;
   41: my $tiffinfo;
   42: my $jpegloader;
   43: my $tiffloader;
   44: my $quantizer;
   45: my $scaler;
   46: my $jpegwriter;
   47: my $pngwriter;
   48: my $converter;
   49: 
   50: ##########################################################################
   51: # subroutines
   52: #
   53: 
   54: #
   55: # checksoft()
   56: #
   57: # returns if all necessary external programs are installed
   58: #
   59: sub checksoft {
   60: 
   61:     my @softdirs = ("/usr/X11R6/bin", "/usr/bin", "/usr/local/bin");
   62: 
   63:     $identifier = findfile(\@softdirs, "identify")
   64: 	or die("ABORT: neccessary external program not found: identify");
   65:     $tiffinfo = findfile(\@softdirs, "tiffinfo")
   66: 	or die("ABORT: neccessary external program not found: tiffinfo");
   67:     $jpegloader = findfile(\@softdirs, "jpegtopnm")
   68: 	or die("ABORT: neccessary external program not found: jpegtopnm");
   69:     $tiffloader = findfile(\@softdirs, "tifftopnm")
   70: 	or die("ABORT: neccessary external program not found: tifftopnm");
   71:     $quantizer = findfile(\@softdirs, "pbmtopgm")
   72: 	or die("ABORT: neccessary external program not found: pbmtopgm");
   73:     $scaler = findfile(\@softdirs, "pnmscale")
   74: 	or die("ABORT: neccessary external program not found: pnmscale");
   75:     $jpegwriter = findfile(\@softdirs, "ppmtojpeg")
   76: 	or die("ABORT: neccessary external program not found: ppmtojpeg");
   77:     $pngwriter = findfile(\@softdirs, "pnmtopng")
   78: 	or die("ABORT: neccessary external program not found: pnmtopng");
   79:     $converter = findfile(\@softdirs, "convert")
   80: 	or die("ABORT: neccessary external program not found: convert");
   81: 
   82: }
   83: 
   84: 
   85: 
   86: #
   87: # findir(\@basedirs, $subdir)
   88: #
   89: # check directories in @basedirs+$subdir and return the first existing basedir
   90: #
   91: sub findir {
   92:     my($dirlist, $subdir) = @_;
   93: 
   94:     foreach my $dir (@$dirlist) {
   95: 	if (-d "$dir/$subdir") {
   96: 	    return "$dir";
   97: 	}
   98:     }
   99:     return;
  100: }
  101: 
  102: #
  103: # findfile(\@basedirs, $filename)
  104: #
  105: # check @basedirs+$filename and return the first existing file
  106: #
  107: sub findfile {
  108:     my($dirlist, $fn) = @_;
  109: 
  110:     foreach my $dir (@$dirlist) {
  111: 	if (-f "$dir/$fn") {
  112: 	    return "$dir/$fn";
  113: 	}
  114:     }
  115:     return;
  116: }
  117: 
  118: 
  119: #
  120: # ($basename, $extension) = splitfn($filename)
  121: #
  122: # split filename into base and (lowercase) extension
  123: #
  124: sub splitfn {
  125:     my ($filepath) = @_;
  126:     if ($filepath =~ /^(.*)\.(\w+)$/) {
  127: 	return ($1, lc($2));
  128:     }
  129:     return;
  130: }
  131: 
  132: 
  133: #
  134: # mmkdir($dirname)
  135: #
  136: # create directory recursively and check permissions
  137: #
  138: sub mmkdir {
  139:     my($dirname) = @_;
  140:     my $newdir;
  141: 
  142:     # does the directory already exist?
  143:     if (-d $dirname) {
  144: 	chmod $dir_perm, $dirname or do {
  145: 	    logger('ERROR', "unable to change permission on $dirname!");
  146: 	    return 0;
  147: 	};
  148: 	return 1;
  149:     }
  150:     # split directory name by levels
  151:     my @dirlist = split /\//, $dirname;
  152:     my @newlist = ();
  153:     my $dir = join("/", @dirlist);
  154:     # test backwards which directories exist
  155:     while (not -d $dir) {
  156: 	last unless ($dir);
  157: 	# move missing elements from the end of @dirlist to @newlist
  158: 	unshift @newlist, pop @dirlist;
  159: 	$dir = join("/", @dirlist);
  160:     }
  161:     # create missing directories level by level
  162:     foreach $newdir (@newlist) {
  163: 	push @dirlist, $newdir;
  164: 	$dir = join("/", @dirlist);
  165: 	mkdir "$dir", $dir_perm or do {
  166: 	    logger('ERROR', "unable to create $dir!");
  167: 	    return 0;
  168: 	}
  169:     }
  170:     return 1;
  171: }
  172: 
  173: #
  174: # ($type, $width, $height) = identify($filepath)
  175: #
  176: sub identify {
  177:     my ($filepath) = @_;
  178:     my $pictype;
  179:     my $picwidth;
  180:     my $picheight;
  181:     my $bitdepth = 0;
  182:     # use quickident first
  183:     $pictype = quickident($filepath);
  184:     # optimize tiff identification
  185:     if (($pictype)&&($pictype eq 'TIFF')) {
  186: 	logger('DEBUG', "running tiffinfo $tiffinfo");
  187: 	if (open(IDENT, "nice -10 $tiffinfo '$filepath' 2>/dev/null |")) {
  188: 	    while (<IDENT>) {
  189: 		chomp;
  190: 		if (/Image Width:\s*(\d+)\s*Image Length:\s*(\d+)/) {
  191: 		    $picwidth = $1;
  192: 		    $picheight = $2;
  193: 		    next;
  194: 		}
  195: 		if (/Bits\/Sample:\s*(\d+)/) {
  196: 		    $bitdepth = $1;
  197: 		    next;
  198: 		}
  199: 	    }
  200: 	    if ($picwidth) {
  201: 		logger('DEBUG', "TIFF $1 x $2");
  202: 		return ($pictype, $picwidth, $picheight, $bitdepth);
  203: 	    }
  204: 	}
  205:     }
  206:     # run ident to get image type and dimensions
  207:     logger('DEBUG', "running identifier $identifier");
  208:     if (open(IDENT, "nice -10 $identifier -ping -format '%w %h %m\n' '$filepath' 2>/dev/null |")) {
  209: 	my @id = <IDENT>;
  210: 	my $picinfo = $id[0];
  211: 	close IDENT;
  212: 	chomp $picinfo;
  213: 	logger('DEBUG', "PIC is '$picinfo'");
  214: 	if ($picinfo =~ /^(\d+) (\d+) (\w+)$/) {
  215: 	    $picwidth = $1;
  216: 	    $picheight = $2;
  217: 	    $pictype = $3;
  218: 	}
  219:     } else {
  220: 	logger('DEBUG', "unable to identify $filepath!");
  221:     }
  222:     return ($pictype, $picwidth, $picheight, $bitdepth);
  223: }
  224: 
  225: #
  226: # $type = quickident($filepath);
  227: #
  228: sub quickident {
  229:     my ($filepath) = @_;
  230:     logger('DEBUG', "running quickident");
  231:     # look at file extension
  232:     my ($filebase, $fileext) = splitfn($filepath);
  233:     if ($fileext) {
  234: 	return $img_type_ext{$fileext};
  235:     }
  236:     return;
  237: }
  238: 
  239: 
  240: #
  241: # $error = scale_jpeg(\$args);
  242: #
  243: # scale JPEG images to JPEG using netpbm tools
  244: #
  245: # args needed: $srcdir, $filename, $destdir, 
  246: #              $scalesize, $scale_rel, $picwidth, $picheight
  247: #
  248: sub scale_jpeg {
  249:     my ($args) = @_;
  250: 
  251:     my $srcdir = $$args{'srcdir'};
  252:     my $filename = $$args{'filename'};
  253:     my $destdir = $$args{'destdir'};
  254:     my $scalesize = $$args{'scalesize'};
  255:     my $scale_rel = $$args{'scale_rel'};
  256:     my $scaleopt;
  257: 
  258:     # convert jpg -> jpg
  259:     my ($basename, $fileext) = splitfn($filename);
  260:     my $newfn = $basename . ".jpg";
  261:     logger('INFO', "Convert(jpg): $filename -> $newfn");
  262:     return 1 if ($simulate);
  263: 
  264:     if ($scale_rel) {
  265: 	# scale relative -- no size needed, only scaling factor
  266: 	$scaleopt = $scalesize;
  267:     } else {
  268: 	# scale to size -- size needed
  269: 	my $pictype = $$args{'pictype'};
  270: 	my $picwidth = $$args{'picwidth'};
  271: 	my $picheight = $$args{'picheight'};
  272: 	if (! $picwidth) {
  273: 	    ($pictype, $picwidth, $picheight) = identify("$srcdir/$filename");
  274: 	    if ((! $pictype)||($picwidth == 0)||($picheight == 0)) {
  275: 		logger('ERROR', "unable to identify $srcdir/$filename!");
  276: 		return 1;
  277: 	    }
  278: 	}
  279: 	if ($picheight > $picwidth) {
  280: 	    $scaleopt = $scalesize / $picheight;
  281: 	    logger('DEBUG', "PIC is portrait");
  282: 	} else {
  283: 	    $scaleopt = $scalesize / $picwidth;
  284: 	    logger('DEBUG', "PIC is landscape");
  285: 	}
  286: 	if ($scaleopt >= 1) {
  287: 	    $scaleopt = 1;
  288: 	    logger('DEBUG', "PIC is already smaller");
  289: 	}
  290:     }
  291: 
  292:     if (!$scaleopt) {
  293: 	logger('ERROR', "unable to calculate scaling options!");
  294: 	return 1;
  295:     }
  296: 
  297:     # convert
  298:     logger('DEBUG', "nice -10 $jpegloader '$srcdir/$filename' 2>/dev/null | nice -10 $scaler $scaleopt 2>/dev/null | nice -10 $jpegwriter > '$destdir/$newfn' 2>/dev/null");
  299:     return 0 if ($simulate);
  300:     if (system("nice -10 $jpegloader '$srcdir/$filename' 2>/dev/null | nice -10 $scaler $scaleopt 2>/dev/null | nice -10 $jpegwriter > '$destdir/$newfn' 2>/dev/null") != 0) {
  301: 	logger('ERROR', "error converting '$srcdir/$filename'!");
  302: 	unlink "$destdir/$newfn";
  303: 	return 1;
  304:     }
  305: 
  306:     # change permissions
  307:     chmod $file_perm, "$destdir/$newfn" or
  308: 	logger('WARNING', "unable to set permission on '$destdir/$newfn'");
  309: 
  310:     if (! -s "$destdir/$newfn") {
  311: 	# file broken (size 0)
  312: 	logger('ERROR', "created file '$destdir/$newfn' broken -- will be removed!");
  313: 	unlink "$destdir/$newfn";
  314: 	return 1;
  315:     }
  316:     return 0;
  317: }
  318: 
  319: 
  320: #
  321: # $error = scale_tiff_jpeg2(\$args);
  322: #
  323: # scale TIFF images to JPEG using ImageMagick convert
  324: #
  325: # args needed: $srcdir, $filename, $destdir, 
  326: #              $scalesize, $scale_rel, $picwidth, $picheight
  327: #
  328: sub scale_tiff_jpeg2 {
  329:     my ($args) = @_;
  330: 
  331:     my $srcdir = $$args{'srcdir'};
  332:     my $filename = $$args{'filename'};
  333:     my $destdir = $$args{'destdir'};
  334:     my $scalesize = $$args{'scalesize'};
  335:     my $scale_rel = $$args{'scale_rel'};
  336:     my $scaleopt;
  337: 
  338:     my ($basename, $fileext) = splitfn($filename);
  339:     my $newfn = $basename . ".jpg";
  340:     logger('INFO', "Convert(tiff2): $filename -> $newfn");
  341:     return 1 if ($simulate);
  342: 
  343:     if ($scale_rel) {
  344: 	# scale relative -- no size needed, only scaling factor
  345: 	$scaleopt = $scalesize;
  346:     } else {
  347: 	# scale to size -- size needed
  348: 	my $pictype = $$args{'pictype'};
  349: 	my $picwidth = $$args{'picwidth'};
  350: 	my $picheight = $$args{'picheight'};
  351: 	if (! $picwidth) {
  352: 	    ($pictype, $picwidth, $picheight) = identify("$srcdir/$filename");
  353: 	    if ((! $pictype)||($picwidth == 0)||($picheight == 0)) {
  354: 		logger('ERROR', "unable to identify $srcdir/$filename!");
  355: 		return 1;
  356: 	    }
  357: 	}
  358: 	if ($picheight > $picwidth) {
  359: 	    $scaleopt = $scalesize / $picheight;
  360: 	    logger('DEBUG', "PIC is portrait");
  361: 	} else {
  362: 	    $scaleopt = $scalesize / $picwidth;
  363: 	    logger('DEBUG', "PIC is landscape");
  364: 	}
  365: 	if ($scaleopt >= 1) {
  366: 	    $scaleopt = 1;
  367: 	    logger('DEBUG', "PIC is already smaller");
  368: 	}
  369:     }
  370: 
  371:     if (!$scaleopt) {
  372: 	logger('ERROR', "unable to calculate scaling options!");
  373: 	return 1;
  374:     }
  375: 
  376:     if ($scale_rel) {
  377: 	my $per_scale = 100 * $scaleopt;
  378: 	logger('DEBUG', "nice -10 $converter -quality $jpeg_quality -scale $per_scale\% '$srcdir/$filename' '$destdir/$newfn' 2>/dev/null");
  379: 	return 0 if ($simulate);
  380: 	if (system("nice -10 $converter -quality $jpeg_quality -scale $per_scale\% '$srcdir/$filename' '$destdir/$newfn' 2>/dev/null\n") != 0) {
  381: 	    logger('ERROR', "error converting '$srcdir/$filename'!");
  382: 	    return 1;
  383: 	}
  384:     } else {
  385: 	logger('DEBUG', "nice -10 $converter -quality $jpeg_quality -scale ${scalesize}x${scalesize} '$srcdir/$filename' '$destdir/$newfn' 2>/dev/null");
  386: 	return 0 if ($simulate);
  387: 	if (system("nice -10 $converter -quality $jpeg_quality -scale ${scalesize}x${scalesize} '$srcdir/$filename' '$destdir/$newfn' 2>/dev/null\n") != 0) {
  388: 	    logger('ERROR', "error converting '$srcdir/$filename'!");
  389: 	    return 1;
  390: 	}
  391:     }
  392: 
  393:     # change permissions
  394:     chmod $file_perm, "$destdir/$newfn" or
  395: 	logger('WARNING', "unable to set permission on '$destdir/$newfn'");
  396: 
  397:     if (! -s "$destdir/$newfn") {
  398: 	# file broken (size 0)
  399: 	logger('ERROR', "created file '$destdir/$newfn' broken -- will be removed!");
  400: 	unlink "$destdir/$newfn";
  401: 	return 1;
  402:     }
  403:     return 0;
  404: }
  405: 
  406: 
  407: #
  408: # $error = scale_tiff_jpeg(\$args);
  409: #
  410: # scale TIFF images to JPEG using netpbm tools
  411: #
  412: # args needed: $srcdir, $filename, $destdir, 
  413: #              $scalesize, $scale_rel, $picwidth, $picheight
  414: #
  415: sub scale_tiff_jpeg {
  416:     my ($args) = @_;
  417: 
  418:     my $srcdir = $$args{'srcdir'};
  419:     my $filename = $$args{'filename'};
  420:     my $destdir = $$args{'destdir'};
  421:     my $scalesize = $$args{'scalesize'};
  422:     my $scale_rel = $$args{'scale_rel'};
  423:     my $scaleopt;
  424: 
  425:     # convert jpg -> jpg
  426:     my ($basename, $fileext) = splitfn($filename);
  427:     my $newfn = $basename . ".jpg";
  428:     logger('INFO', "Convert(tiff1): $filename -> $newfn");
  429:     return 1 if ($simulate);
  430: 
  431:     if ($scale_rel) {
  432: 	# scale relative -- no size needed, only scaling factor
  433: 	$scaleopt = $scalesize;
  434:     } else {
  435: 	# scale to size -- size needed
  436: 	my $pictype = $$args{'pictype'};
  437: 	my $picwidth = $$args{'picwidth'};
  438: 	my $picheight = $$args{'picheight'};
  439: 	if (! $picwidth) {
  440: 	    ($pictype, $picwidth, $picheight) = identify("$srcdir/$filename");
  441: 	    if ((! $pictype)||($picwidth == 0)||($picheight == 0)) {
  442: 		logger('ERROR', "unable to identify $srcdir/$filename!");
  443: 		return 1;
  444: 	    }
  445: 	}
  446: 	if ($picheight > $picwidth) {
  447: 	    $scaleopt = $scalesize / $picheight;
  448: 	    logger('DEBUG', "PIC is portrait");
  449: 	} else {
  450: 	    $scaleopt = $scalesize / $picwidth;
  451: 	    logger('DEBUG', "PIC is landscape");
  452: 	}
  453: 	if ($scaleopt >= 1) {
  454: 	    $scaleopt = 1;
  455: 	    logger('DEBUG', "PIC is already smaller");
  456: 	}
  457:     }
  458: 
  459:     if (!$scaleopt) {
  460: 	logger('ERROR', "unable to calculate scaling options!");
  461: 	return 1;
  462:     }
  463: 
  464:     # convert
  465:     logger('DEBUG', "nice -10 $tiffloader '$srcdir/$filename' 2>/dev/null | nice -10 $scaler $scaleopt 2>/dev/null | nice -10 $jpegwriter --quality $jpeg_quality > '$destdir/$newfn' 2>/dev/null");
  466:     return 0 if ($simulate);
  467:     if (system("nice -10 $tiffloader '$srcdir/$filename' 2>/dev/null | nice -10 $scaler $scaleopt 2>/dev/null | nice -10 $jpegwriter --quality $jpeg_quality > '$destdir/$newfn' 2>/dev/null") != 0) {
  468: 	logger('ERROR', "error converting '$srcdir/$filename'!");
  469: 	unlink "$destdir/$newfn";
  470: 	return 1;
  471:     }
  472: 
  473:     # change permissions
  474:     chmod $file_perm, "$destdir/$newfn" or
  475: 	logger('WARNING', "unable to set permission on '$destdir/$newfn'");
  476: 
  477:     if (! -s "$destdir/$newfn") {
  478: 	# file broken (size 0)
  479: 	logger('ERROR', "created file '$destdir/$newfn' broken -- will be removed!");
  480: 	unlink "$destdir/$newfn";
  481: 	return 1;
  482:     }
  483:     return 0;
  484: }
  485: 
  486: 
  487: 
  488: #
  489: # $error = scale_tiff_png(\$args);
  490: #
  491: # scale TIFF images to PNG using netpbm tools
  492: #
  493: # args needed: $srcdir, $filename, $destdir, 
  494: #              $scalesize, $scale_rel, $picwidth, $picheight
  495: #
  496: sub scale_tiff_png {
  497:     my ($args) = @_;
  498: 
  499:     my $srcdir = $$args{'srcdir'};
  500:     my $filename = $$args{'filename'};
  501:     my $destdir = $$args{'destdir'};
  502:     my $scalesize = $$args{'scalesize'};
  503:     my $bitdepth = $$args{'bitdepth'};
  504:     my $scale_rel = $$args{'scale_rel'};
  505:     my $scaleopt;
  506: 
  507:     # convert jpg -> jpg
  508:     my ($basename, $fileext) = splitfn($filename);
  509:     my $newfn = $basename . ".png";
  510:     logger('INFO', "Convert(tiff3): $filename -> $newfn");
  511: 
  512:     if ($scale_rel) {
  513: 	# scale relative -- no size needed, only scaling factor
  514: 	$scaleopt = $scalesize;
  515:     } else {
  516: 	# scale to size -- size needed
  517: 	my $pictype = $$args{'pictype'};
  518: 	my $picwidth = $$args{'picwidth'};
  519: 	my $picheight = $$args{'picheight'};
  520: 	if (! $picwidth) {
  521: 	    ($pictype, $picwidth, $picheight, $bitdepth) = identify("$srcdir/$filename");
  522: 	    if ((! $pictype)||($picwidth == 0)||($picheight == 0)) {
  523: 		logger('ERROR', "unable to identify $srcdir/$filename!");
  524: 		return 1;
  525: 	    }
  526: 	}
  527: 	if ($picheight > $picwidth) {
  528: 	    $scaleopt = $scalesize / $picheight;
  529: 	    logger('DEBUG', "PIC is portrait");
  530: 	} else {
  531: 	    $scaleopt = $scalesize / $picwidth;
  532: 	    logger('DEBUG', "PIC is landscape");
  533: 	}
  534: 	if ($scaleopt >= 1) {
  535: 	    $scaleopt = 1;
  536: 	    logger('DEBUG', "PIC is already smaller");
  537: 	}
  538:     }
  539: 
  540:     if (!$scaleopt) {
  541: 	logger('ERROR', "unable to calculate scaling options!");
  542: 	return 1;
  543:     }
  544: 
  545:     # convert
  546:     my $cmd = "nice -10 $tiffloader \'$srcdir/$filename\' 2>/dev/null ";
  547:     if ($bitdepth == 1) {
  548: 	# antialiasing bilevel images
  549: 	$cmd .= "| nice -10 $quantizer 2 2 2>/dev/null ";
  550:     }
  551:     $cmd .= "| nice -10 $scaler $scaleopt 2>/dev/null | nice -10 $pngwriter > '$destdir/$newfn' 2>/dev/null";
  552:     logger('DEBUG', "$cmd");
  553:     return 0 if ($simulate);
  554:     if (system($cmd) != 0) {
  555: 	logger('ERROR', "error converting '$srcdir/$filename'!");
  556: 	unlink "$destdir/$newfn";
  557: 	return 1;
  558:     }
  559: 
  560:     # change permissions
  561:     chmod $file_perm, "$destdir/$newfn" or
  562: 	logger('WARNING', "unable to set permission on '$destdir/$newfn'");
  563: 
  564:     if (! -s "$destdir/$newfn") {
  565: 	# file broken (size 0)
  566: 	logger('ERROR', "created file '$destdir/$newfn' broken -- will be removed!");
  567: 	unlink "$destdir/$newfn";
  568: 	return 1;
  569:     }
  570:     return 0;
  571: }
  572: 
  573: 
  574: #
  575: # $error = convert_file($srcdir, $filename, $destdir);
  576: #
  577: # convert file
  578: #
  579: sub convert_file {
  580:     my($srcdir, $filename, $destdir) = @_;
  581:     my $filebase;
  582:     my $fileext;
  583:     my $newfn;
  584:     my $pictype;
  585:     my $picwidth;
  586:     my $picheight;
  587:     my $bitdepth;
  588:     my $error = 0;
  589:  
  590:     logger('DEBUG', "convert_file ($srcdir, $filename, $destdir)");
  591: 
  592:     if (not (( -f "$srcdir/$filename") && (-r _))) {
  593: 	logger('ERROR', "unable to read file '$srcdir/$filename'");
  594: 	return 1;
  595:     }
  596: 
  597:     # get base name and extension
  598:     if ($filename =~ /^(.*)\.(\w+)$/) {
  599: 	$filebase = $1;
  600: 	$fileext = $2;
  601:     }
  602: 
  603:     #
  604:     # quick check if target image exists
  605:     #
  606:     $pictype = quickident("$srcdir/$filename");
  607:     if ($pictype) {
  608: 	my $newext = $target_ext_type{$pictype};
  609: 	if ($newext) {
  610: 	    $newfn = $filebase . ".$newext";
  611: 	    # check if file exists
  612: 	    if (-f "$destdir/$newfn") {
  613: 		logger('DEBUG', "CONV file exists: $newfn");
  614: 		if (! $overwrite) {
  615: 		    logger('INFO', "File already converted: $newfn");
  616: 		    return 0;
  617: 		}
  618: 	    }
  619: 	} else {
  620: 	    logger('DEBUG', "target extension for $pictype unknown!");
  621: 	}
  622:     } else {
  623: 	# quick ident failed -- do it slowly
  624: 
  625: 	($pictype, $picwidth, $picheight, $bitdepth) = identify("$srcdir/$filename");
  626: 	if ((! $pictype)||($picwidth == 0)||($picheight == 0)) {
  627: 	    logger('WARNING', "unknown file type '$srcdir/$filename'");
  628: 	    return 0;
  629: 	}
  630:     }
  631: 
  632:     # collect arguments for the conversion
  633:     my %args;
  634:     $args{'srcdir'} = $srcdir;
  635:     $args{'destdir'} = $destdir;
  636:     $args{'filename'} = $filename;
  637:     $args{'pictype'} = $pictype;
  638:     $args{'picwidth'} = $picwidth;
  639:     $args{'picheight'} = $picheight;
  640:     $args{'bitdepth'} = $bitdepth;
  641:     $args{'srcdir'} = $srcdir;
  642:     $args{'scalesize'} = $scalesize;
  643:     $args{'scale_rel'} = $scale_relative;
  644: 
  645:     # decide conversion based on image type and encoding preferences
  646:     if ($pictype eq 'JPEG') {
  647: 	$args{'jpeg_qual'} = $jpeg_quality;
  648: 	#default encoder
  649: 	$error = scale_jpeg(\%args);
  650:     } elsif ($pictype eq 'TIFF') {
  651: 	if ($use_encoder) {
  652: 	    # use specific encoder
  653: 	    if ($use_encoder eq 'tiff_jpeg') {
  654: 		$error = scale_tiff_jpeg(\%args);
  655: 	    } elsif ($use_encoder eq 'tiff_jpeg2') {
  656: 		$error = scale_tiff_jpeg2(\%args);
  657: 	    } elsif ($use_encoder eq 'tiff_png') {
  658: 		$error = scale_tiff_png(\%args);
  659: 	    }
  660: 	} else {
  661: 	    # default
  662: 	    $error = scale_tiff_jpeg(\%args);
  663: 	}
  664:     } else {
  665: 	logger('WARNING', "unknown file type: $pictype ($srcdir/$filename)");
  666:     }
  667:     return $error;
  668: }
  669: 
  670: 
  671: #
  672: # walk_convert_dir($dirname)
  673: #
  674: # Descend recursively through $dirname and work on all files
  675: #
  676: sub walk_convert_dir {
  677:     my($srcdir, $workdir, $destdir) = @_;
  678:     my $errcnt = 0;
  679:     my $newfn;
  680: 
  681:     opendir WORKDIR, "$srcdir/$workdir" or do {
  682: 	logger('ERROR', "Unable to open directory $srcdir/$workdir!");
  683: 	return 0;
  684:     };
  685: 
  686:     my @dirlist = readdir(WORKDIR);
  687: 
  688:     closedir WORKDIR;
  689: 
  690:     if ($do_descend) {
  691: 	foreach (sort @dirlist) {
  692: 	    next if (/^[.]+$/);
  693: 	    next if ($junk_files{$_});
  694: 	    if (-d "$srcdir/$workdir/$_") {
  695: 		walk_convert_dir($srcdir, "$workdir/$_", $destdir);
  696: 	    }
  697: 	}
  698:     }
  699: 
  700:     logger('INFO', "Working on $workdir");
  701:     logger('INFO', "Reading from $srcdir/$workdir.");
  702:     logger('INFO', "Writing to $destdir/$workdir");
  703: 
  704:     # create destination directory
  705:     if (not ($simulate)) {
  706: 	mmkdir("$destdir/$workdir") or do {
  707: 	    logger("ERROR", "unable to create directory '$destdir/$workdir'");
  708: 	    $errcnt++;
  709: 	    return 0;
  710: 	};
  711:     }
  712: 
  713:     foreach (sort @dirlist) {
  714: 	# skip dot-directories
  715: 	if (/^[.]+.*$/) {
  716: 	    next;
  717: 	}
  718: 	if (-f "$srcdir/$workdir/$_") {
  719: 	    $errcnt += convert_file("$srcdir/$workdir", "$_", "$destdir/$workdir");
  720: 	}
  721:     }
  722: 
  723:     if ($errcnt) {
  724: 	logger('INFO', "There were $errcnt errors converting '$workdir'!");
  725:     } else {
  726: 	logger('INFO', "Finished converting $workdir!");
  727:     }
  728: 
  729:     return 1;
  730: }
  731: 
  732: 
  733: #
  734: # convert_dir($from_dir)
  735: #
  736: # Convert directory "from_dir" and its subdirectories
  737: #
  738: sub convert_dir {
  739:     my ($srcdir, $workdir, $destdir) = @_;
  740: 
  741:     logger('INFO', "** Converting Scans **");
  742:     logger('INFO', "Starting in directory '$srcdir/$workdir'");
  743:     
  744:     walk_convert_dir($srcdir, $workdir, $destdir);
  745: 
  746:     # touch source directory so digilib rescans the thumbnails
  747:     #logger('DEBUG', "/usr/bin/touch $source_base_dirs[0]/$workdir");
  748:     system("/usr/bin/touch '$srcdir/$workdir'");
  749: 
  750:     logger('DONE', "** Finished converting scans **");
  751:     return 1;
  752: }
  753: 
  754: 
  755: 
  756: 
  757: 
  758: 
  759: ###############################################################
  760: ## Main
  761: 
  762: if ($#ARGV < 3) {
  763:     print "Scale-O-Mat $version\n";
  764:     print "  use: scaleomat.pl -src=src-base -dest=dest-base -dir=workdir [...]\n";
  765:     print "    reads from scr-base/workdir and writes to dest-base/workdir\n";
  766:     print "    -scaleto=destination size\n";
  767:     print "    -scaleby=magnification factor.\n";
  768:     print "    -jpegqual=JPEG quality (0-100)\n";
  769:     print "    -replace=yes replaces existing files (default=skip).\n";
  770:     print "    -encoder=tiff_png|tiff_jpeg|tiff_jpeg2\n";
  771:     exit 1;
  772: }
  773: 
  774: # test software installation
  775: checksoft();
  776: 
  777: # read command line parameters
  778: my $args = parseargs();
  779: 
  780: # source dir
  781: my $srcdir = $$args{'src'};
  782: 
  783: # destination dir
  784: my $destdir = $$args{'dest'};
  785: 
  786: # working dir
  787: my $workdir = $$args{'dir'};
  788: 
  789: # destination size
  790: if ($$args{'scaleby'}) {
  791:     $scale_relative = 1;
  792:     $scalesize = $$args{'scaleby'};
  793:     logger('INFO', "Scaling relative by factor $scalesize");
  794: }
  795: if ($$args{'scaleto'}) {
  796:     $scale_relative = 0;
  797:     $scalesize = $$args{'scaleto'};
  798:     logger('INFO', "Scaling absolute to size $scalesize");
  799: }
  800: 
  801: # JPEG quality
  802: if ($$args{'jpegqual'}) {
  803:     logger('INFO', "JPEG quality set to '$$args{'jpegqual'}'!");
  804:     $jpeg_quality = $$args{'jpegqual'};
  805: }
  806: 
  807: # force encoder
  808: if ($$args{'encoder'}) {
  809:     logger('INFO', "Using encoder '$$args{'encoder'}'!");
  810:     $use_encoder = $$args{'encoder'};
  811: }
  812: 
  813: # Overwrite
  814: if ($$args{'replace'}) {
  815:     logger('INFO', "Set to overwrite existing files!");
  816:     $overwrite = 1;
  817: }
  818: 
  819: # debug
  820: if ($$args{'debug'}) {
  821:     logger('INFO', "Set debug level to $$args{'debug'}!");
  822:     $debug = $$args{'debug'};
  823: }
  824: 
  825: # simulate
  826: if ($$args{'simulate'}) {
  827:     logger('INFO', "Set to simulate operation only ($$args{'simulate'})!");
  828:     $simulate = $$args{'simulate'};
  829: }
  830: 
  831: convert_dir($srcdir, $workdir, $destdir);

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>