source: trunk/npemap.org.uk/scripts/tile-processing/makeSmaller.pl @ 411

Last change on this file since 411 was 411, checked in by Nick Burch, 13 years ago

Support some on-the-fly resizing when building really big scaled files

  • Property svn:executable set to *
File size: 2.4 KB
Line 
1#!/usr/bin/perl
2#
3use List::Util qw[min max];
4use Image::Magick;
5
6my $tilesize = 125;
7
8my $scale = shift;
9unless($scale) { $scale = 6; }
10
11# Should we rescale as we go?
12my $rescale_by = 1;
13if($scale > 20) {
14        $rescale_by = 4;
15}
16my $out_tile_size = int($tilesize / $rescale_by);
17
18my $outdir = "scaled$scale";
19
20if (! -d $outdir) {
21    mkdir $outdir or die "Unable to create dir '$outdir'"
22}
23
24my @files = glob("*/tile-*.jpg");
25my %tiles ;
26
27my $minx, $miny, $maxx, $maxy;
28
29foreach my $f (@files) {
30  $f =~ m/-(\d+)-(\d+)\./;
31  my ($x, $y) = ($1 +0, $2 +0);
32  $tiles{$x} ||= {};
33  $tiles{$x}{$y} = $f;
34}
35
36
37$maxx = max(keys %tiles);
38$maxy = max(map { max(keys %{$tiles{$_}})} keys %tiles);
39
40# start at 0, if there are any tiles in a WxW square, render a scale model
41# of it
42
43foreach my $x (0..($maxx/$scale)) {
44    foreach my $y (0..($maxy/$scale)) {
45        my $filename = sprintf("%s/%03d/%03d.jpg", $outdir, $x, $y);
46        my $outdir = sprintf("%s/%03d/", $outdir, $x);
47               
48
49        if( (! -f $filename) && any_tiles($x, $y, \%tiles) ) {
50            print "Making $filename\n";
51            my $out = Image::Magick->new( size => "".($out_tile_size*$scale)."x".($out_tile_size*$scale) );
52            $out ->ReadImage('xc:white');
53
54            unless(-d $outdir) {
55                mkdir($outdir);
56            }
57
58 foreach my $i (0..($scale -1)) {
59     foreach my $j (0..($scale -1)) {
60         if (defined $tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
61            my $input = $tiles{($x*$scale)+$i}{($y*$scale)+$j};
62            my $image = Image::Magick->new;
63            print $image->Read($input);
64                        #print "  Including $input\n";
65
66                        if($rescale_by > 1) {
67                                $image->Resize("${out_tile_size}x${out_tile_size}");
68                                #print "Resized $input to ${out_tile_size}x${out_tile_size}\n";
69                        }
70
71            print $out->Composite(image=>$image, x=> ($i*$out_tile_size), y=> ((($scale -1)-$j)*$out_tile_size) );
72            undef $image;
73        }
74     }
75 }
76
77            $out->Resize("${tilesize}x$tilesize");
78            $out->Set(quality=>85);
79            $out->Write("jpg:$filename");
80            undef $out;
81            print "($x,$y)\n";
82        }
83   }
84}
85
86use Data::Dumper;
87
88print "($maxx, $maxy)\n";
89
90sub any_tiles {
91 my ($x, $y, $tiles) = (shift, shift, shift);
92 foreach my $i (0..($scale -1)) {
93     foreach my $j (0..($scale -1)) {
94         if (defined $$tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
95             return 1;
96         }
97     }
98 }
99 return 0;
100}
Note: See TracBrowser for help on using the repository browser.