#!/usr/bin/perl use strict; use warnings; use File::Spec; use Panotools::Script; use Image::Size; use File::Temp qw/tempdir/; my $opts = {}; my @qtvr_opts = (); while (@ARGV) { my ($key, $value) = split ('=', shift); $opts->{$key} = $value; push @qtvr_opts, ($key .'='. $value); } my $cleanup = 1; $cleanup = 0 if (defined $opts->{'--cleanup'} and $opts->{'--cleanup'} == 0); my $quality = $opts->{'--quality'} || 70; my $pitch = $opts->{'--pitch'} || 0; my $yaw = $opts->{'--yaw'} || 0; my $outfile = $opts->{'--outfile'} || undef; $outfile = File::Spec->rel2abs ($outfile) if defined ($outfile); my $erect = $opts->{'--erect'} or die "usage\n $0 --erect=mypanorama.tif Generates a cubic QTVR named mypanorama.mov. Input needs to be a full 360 degree equirectangular image in PNG, JPEG or TIFF format. Options: --erect Filename of equirectangular input (required) --pitch pre-rotates the entire panorama. eg. if your panorama has the nadir in the centre set this to -90 --yaw pre-rotates the entire panorama. --quality JPEG quality for QTVR tiles, defaults to 70 --cleanup set to '0' to keep temporary files, defaults to '1' A subset of jpeg2qtvr options are also accepted: --date date in seconds since January 1st 1970, defaults to current time --name title of the panorama --outfile output filename, defaults to input filename with .mov extension --width preferred window width, defaults to 1024 --height preferred window height, defaults to 768 --pan initial pan (yaw), defaults to 0.0 degrees --tilt initial tilt (pitch), defaults to 0.0 degrees --fov initial vertical angle of view, defaults to 60 degrees --min-fov minimum vertical angle of view, defaults to 10 degrees --max-fov maximum vertical angle of view, defaults to 120 degrees"; $erect = File::Spec->rel2abs ($erect); my $cwd = File::Spec->rel2abs (File::Spec->curdir); my $tempdir = tempdir (CLEANUP => $cleanup); my $stub = $erect; $stub =~ s/\.([[:alnum:]]+)$//; my $prefix = File::Spec->catfile ($tempdir, 'cube'); my $pto_temp = "$stub.erect2qtvr.$$.pto"; system ('erect2cubic', "--erect=$erect", "--ptofile=$pto_temp", "--filespec=TIFF_m", "--pitch=$pitch", "--yaw=$yaw"); system ('nona', '-o', "$prefix-face", $pto_temp); # generate JPEG cubefaces for my $index (0 .. 5) { if ($^O eq "darwin") { system ('sips', '-s', 'format', 'jpeg', '-s', 'formatOptions', $quality, "$prefix-face000$index.tif", '--out', "$prefix-face000$index.jpg"); } else { system ('convert', '-quality', $quality, "$prefix-face000$index.tif", "$prefix-face000$index.jpg"); } } # fisheye cubefaces for preview track my $scratch = new Panotools::Script; $scratch->Read ($pto_temp); $scratch->Panorama->Set (v => 100, f => 3); $scratch->Write ($pto_temp); system ('nona', '-o', "$prefix-preview", $pto_temp); unlink $pto_temp; $scratch = new Panotools::Script; $scratch->Panorama->Set (v => 90, f => 0, w => 256, h => 256, n => '"TIFF"'); $scratch->Image->[0] = new Panotools::Script::Line::Image; for my $index (0 .. 5) { # generate JPEG preview cubefaces if ($^O eq "darwin") { system ('sips', '-z', '32', '32', "$prefix-preview000$index.tif"); } else { system ('mogrify', '-geometry', '32x32', "$prefix-preview000$index.tif"); } $scratch->Image->[0]->Set (w => 32, h => 32, v => 100, f => 3, r => 0, p => 0, y => 0, n => "\"$prefix-preview000$index.tif\""); $scratch->Write ($pto_temp); system ('nona', '-o', "$prefix-preview-rectilinear.tif", $pto_temp); unlink $pto_temp; if ($^O eq "darwin") { system ('sips', '-s', 'format', 'jpeg', '-s', 'formatOptions', $quality, "$prefix-preview-rectilinear.tif", '--out', "$prefix-preview000$index.jpg"); } else { system ('convert', '-quality', $quality, "$prefix-preview-rectilinear.tif", "$prefix-preview000$index.jpg"); } } print "Tempdir: $tempdir\n" unless $cleanup; $outfile = "$stub.mov" unless (defined $outfile); system ('jpeg2qtvr', @qtvr_opts, "--prefix=$prefix-face000", "--preview=$prefix-preview000", "--outfile=$outfile"); __END__ =head1 NAME erect2qtvr - Assemble a Quicktime QTVR file from an equirectangular image =head1 Synopsis erect2qtvr --erect=mypanorama.tif =head1 DESCRIPTION This tool generates a cubic QTVR from a single equirectangular image, see L for more details of the input file format. A QTVR file is created with the same path as the input image except with a .mov extension. =head1 Calling syntax erect2qtvr [options] --erect=mypanorama.tif Options: --erect Filename of equirectangular input (required) --pitch pre-rotates the entire panorama. eg. if your panorama has the nadir in the centre set this to -90 --yaw pre-rotates the entire panorama. --quality JPEG quality for QTVR tiles, defaults to 70 --cleanup set to '0' to keep temporary files, defaults to '1' A subset of jpeg2qtvr options are also accepted: --date date in seconds since January 1st 1970, defaults to current time --name title of the panorama --outfile output filename, defaults to input filename with mov extension --width preferred window width, defaults to 1024 --height preferred window height, defaults to 768 --pan initial pan (yaw), defaults to 0.0 degrees --tilt initial tilt (pitch), defaults to 0.0 degrees --fov initial vertical angle of view, defaults to 60 degrees --min-fov minimum vertical angle of view, defaults to 10 degrees --max-fov maximum vertical angle of view, defaults to 120 degrees"; =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 March 2007, Bruno Postle