22 |
mkpath $path || die "can't create $path: $!"; |
mkpath $path || die "can't create $path: $!"; |
23 |
} |
} |
24 |
|
|
25 |
foreach my $zoom ( 1 .. 12 ) { |
print "redering test 100dpi page to get pixel size\n"; |
26 |
|
system("pdftoppm -f 1 -l 1 -r 100 $pdf ppm/test") == 0 or die "can't render test: $?"; |
27 |
|
my $test = 'ppm/test-000001.ppm'; |
28 |
|
open(my $fh, '<', $test) || die "can't open $test: $!"; |
29 |
|
my $res = <$fh>; |
30 |
|
$res = <$fh>; |
31 |
|
my ( $x_res, $y_res ) = split(/\s+/,$res); |
32 |
|
print "## 100 dpi resolution = $x_res*$y_res\n"; |
33 |
|
close($fh); |
34 |
|
|
35 |
|
$x_res *= ( $to_page - $from_page + 1 ); |
36 |
|
|
37 |
my $dpi = $zoom * 15; |
print "## total size = $x_res*$y_res\n"; |
38 |
|
|
39 |
|
# initial width = 2 tiles |
40 |
|
my $start_dpi = int( 100 / ( $x_res / 512 ) ); |
41 |
|
|
42 |
|
foreach my $zoom ( 1 .. 10 ) { |
43 |
|
|
44 |
|
my $dpi = $start_dpi * $zoom; |
45 |
|
|
46 |
my $ppm = sprintf("ppm/%03d", $dpi); |
my $ppm = sprintf("ppm/%03d", $dpi); |
47 |
|
|
60 |
my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page); |
my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page); |
61 |
die "can't find page $tmp" unless -f $tmp; |
die "can't find page $tmp" unless -f $tmp; |
62 |
|
|
63 |
my $img = Imager->new; |
my $p_img = Imager->new; |
64 |
$img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr; |
$p_img->read(file=>$tmp) or die "Can't load $tmp: ", $p_img->errstr; |
65 |
|
|
66 |
$x_size += $img->getwidth(); |
$x_size += $p_img->getwidth(); |
67 |
my $h = $img->getheight(); |
my $h = $p_img->getheight(); |
68 |
$y_size = $h if $h > $y_size; |
$y_size = $h if $h > $y_size; |
69 |
|
|
70 |
push @page_imgs, $img; |
push @page_imgs, $p_img; |
71 |
} |
} |
72 |
|
|
73 |
print "loaded $from_page-$to_page of $x_size*$y_size pixels\n"; |
print "loaded $from_page-$to_page of $x_size*$y_size pixels\n"; |
106 |
if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) { |
if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) { |
107 |
warn "## expand tile to full size\n"; |
warn "## expand tile to full size\n"; |
108 |
my $t2 = Imager->new(xsize => 256, ysize => 256); |
my $t2 = Imager->new(xsize => 256, ysize => 256); |
109 |
|
$t2->box(filled=>1, color=>$back_color); |
110 |
$t2->paste( |
$t2->paste( |
111 |
top => 256 - $size->{height}, |
top => 256 - $size->{height}, |
112 |
left => 0, |
left => 0, |
139 |
|
|
140 |
} |
} |
141 |
} |
} |
142 |
|
|
143 |
|
# break if zoom level over 300dpi |
144 |
|
last if $dpi > 300; |
145 |
} |
} |
146 |
|
|
147 |
|
|