#!/usr/bin/perl use strict; use warnings; use File::Temp qw/tempdir/; use File::Spec; use Panotools::Script; my @parameters; my @files; my %images; my $outfile; my $script; my $tempdir = tempdir (CLEANUP => 1); # parse command-line parameters while (@ARGV) { my $arg = shift @ARGV; if ($arg =~ /^-o/) { $outfile = File::Spec->rel2abs (shift @ARGV); } elsif ($arg =~ /^-v/ || $arg =~ /^-c/ ) { push @parameters, $arg; } elsif ($arg =~ /^-i/) { my $img = shift @ARGV; $img =~ s/^([0-9]+)[^0-9]*$/$1/g; $images{$img} = 1; } elsif ($arg =~ /^-/) { push @parameters, $arg; push @parameters, (shift @ARGV); } elsif ( ! $script ) { $script = File::Spec->rel2abs ( $arg ); } else { push @files, $arg; } } die "Usage: $0 [options] -o output project_file (image files)" unless ($outfile && $script); my $pano = new Panotools::Script; $pano->Read ($script); my $index = 0; # update input filenames for my $file (@files) { $pano->Image->[$index]->{n} = "\"$file\""; $index++; } my $i = 0; for my $image (@{$pano->Image}) { my $tempfile = File::Spec->catfile ($tempdir, "$i.tif"); my $name = $image->{n}; $name =~ s/(^"|"$)//g; my $prefix = $name; $prefix =~ s/\.[[:alnum:]]+$//i; # prefer TIF or SVG versions if they exist $name = "$prefix.tif" if (-e "$prefix.tif"); $name = "$prefix.svg" if (-e "$prefix.svg"); # skip mask generation if -i argument given and no mask images for those if ( keys %images && ! exists $images{$i} ) { $i++; $image->{n} = "\"$name\""; next; } my $mask = $prefix . '_mask.tif'; if (-e $mask) { print STDERR "Using mask $mask\n"; system ('composite', '-compose', 'CopyOpacity', $mask, $name, $tempfile); $image->{n} = "\"$tempfile\""; } elsif ($name =~ /\.svg$/i) { print STDERR "Converting $image->{n} to TIFF\n"; system ('convert', '-background', 'transparent', $name, $tempfile); $image->{n} = "\"$tempfile\""; } else { $image->{n} = "\"$name\""; } $i++; } my $pto_temp = "$script.nona-mask.$$.pto"; $pano->Write ($pto_temp); foreach (keys %images) { push @parameters,"-i"; push @parameters,$_; } system ('nona', @parameters, '-o', $outfile, $pto_temp); unlink $pto_temp; __END__ =head1 NAME nona-mask - Wrapper around nona for managing external masks =head1 Synopsis nona-mask [options] -o output project_file (image files) =head1 DESCRIPTION Wrapper around nona. Usage is exactly the same as for nona, except that if files named '_mask.tif' exist, they are inserted as alpha masks before stitching. Some examples of valid image pairs: DSC_1234.tif DSC_1234_mask.tif IMG_5678.JPG IMG_5678_mask.tif Note masks can be any bit depth, but must have no alpha channel. Black indicates areas to be ignored, any other colour indicates areas that may be blended. Note also that only masks need to be TIFF files, input images can be any filetype supported by nona. Requires Panotools::Script, nona and ImageMagick. L =head1 License This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. =head1 See Also L, L =head1 Author April 2007, Bruno Postle