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

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

Print progress, and accept scale on command line

  • Property svn:executable set to *
File size: 1.8 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
11my $outdir = "scaled$scale";
12
13if (! -d $outdir) {
14    mkdir $outdir or die "Unable to create dir '$outdir'"
15}
16
17my @files = glob("*/tile-*.jpg");
18my %tiles ;
19
20my $minx, $miny, $maxx, $maxy;
21
22foreach my $f (@files) {
23  $f =~ m/-(\d+)-(\d+)\./;
24  my ($x, $y) = ($1 +0, $2 +0);
25  $tiles{$x} ||= {};
26  $tiles{$x}{$y} = $f;
27
28}
29
30
31$maxx = max(keys %tiles);
32$maxy = max(map { max(keys %{$tiles{$_}})} keys %tiles);
33
34# start at 0, if there are any tiles in a WxW square, render a scale model
35# of it
36
37foreach my $x (0..($maxx/$scale)) {
38    foreach my $y (0..($maxy/$scale)) {
39      my $filename = sprintf("%s/%03d/%03d.jpg", $outdir,$x,$y);
40      if ((! -f $filename) && any_tiles($x, $y, \%tiles) ) {
41                print "Making $filename\n";
42         my $out = Image::Magick->new(size => ($tilesize * $scale). "x".($tilesize *$scale));
43         $out ->ReadImage('xc:white');
44 foreach my $i (0..($scale -1)) {
45     foreach my $j (0..($scale -1)) {
46         if (defined $tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
47            my $image = Image::Magick->new;
48            print $image->Read($tiles{($x*$scale)+$i}{($y*$scale)+$j});
49            print $out->Composite(image=>$image, x=>($i*$tilesize), y=>((($scale -1)-$j)*$tilesize));
50            undef $image;
51        }
52     }
53 }
54 $out->Resize("${tilesize}x$tilesize");
55 $out->Set(quality=>85);
56 $out->Write("jpg:$filename");
57 undef $out;
58          print "($x,$y)\n";
59       
60      }
61    }
62}
63
64use Data::Dumper;
65
66print "($maxx, $maxy)\n";
67
68sub any_tiles {
69 my ($x, $y, $tiles) = (shift, shift, shift);
70 foreach my $i (0..($scale -1)) {
71     foreach my $j (0..($scale -1)) {
72         if (defined $$tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
73             return 1;
74         }
75     }
76 }
77 return 0;
78}
Note: See TracBrowser for help on using the repository browser.