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

Last change on this file since 182 was 182, checked in by David Sheldon, 13 years ago

Set the quality in imagemagic, it defaults to 100%, we save over 50% of
the size by reducing it.

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