1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#!/usr/bin/perl
# Copyright © 2009 by Daniel Friesel <derf@derf.homelinux.org>
# License: WTFPL <http://sam.zoy.org/wtfpl>
use strict;
use warnings;
use Image::Imlib2;
use constant {
DEFAULT_FILEMODE => oct(644),
THUMB_MAX_DIM => 150,
THUMB_QUALITY => 60,
};
my $directory = shift || '.';
my $thumbdir = "$directory/.thumbs";
my $indexfile = "$directory/index.xhtml";
my ($dx, $dy);
my @files;
my $number = 0;
local $| = 1;
sub print_progress {
if (($number % 60) == 0) {
if ($number) {
printf(" %4d/%d\n", $number, scalar(@files));
}
printf('[%3d%%] ', $number * 100 / @files);
} elsif (($number % 10) == 0) {
print ' ';
}
return;
}
open(my $index, '>', $indexfile) or die("Cannot open $indexfile for writing: $!");
print $index <<'EOD';
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body><div>
EOD
if (! -d $thumbdir) {
mkdir($thumbdir) or die("cannot create $thumbdir: $!");
}
opendir(my $dirhandle, $directory) or die("Cannot open directory $directory: $!");
foreach my $file (readdir($dirhandle)) {
if ($file =~ / \. ( png | jp e? g ) $ /ix) {
push(@files, $file);
}
}
closedir($dirhandle);
print "Generating thumbnails [ - cached | + generated ]\n";
foreach my $file (sort(@files)) {
my $image = Image::Imlib2->load($file);
my $thumb;
printf {$index} (
'<div style="float: left; width: %dpx; height: %dpx">',
THUMB_MAX_DIM * 1.1,
THUMB_MAX_DIM * 1.1,
);
print {$index} "<a href=\"$file\"><img src=\".thumbs/$file\" alt=\"$file\" /></a></div>\n";
print_progress;
$number++;
if (-e "$thumbdir/$file") {
print '-';
next;
}
($dx, $dy) = ($image->width, $image->height);
if ($dx > $dy) {
$thumb = $image->create_scaled_image(THUMB_MAX_DIM, 0);
} else {
$thumb = $image->create_scaled_image(0, THUMB_MAX_DIM);
}
$thumb->set_quality(THUMB_QUALITY);
$thumb->save("$thumbdir/$file");
chmod(DEFAULT_FILEMODE, "$thumbdir/$file");
print '+';
}
print "\n";
print $index <<'EOD';
</div></body>
</html>
EOD
close($index) or die("Cannot close $indexfile: $!");
chmod(DEFAULT_FILEMODE, $indexfile);
__END__
=head1 NAME
gen-xhtml-thumbnails - Generate Thumbnails + Index for a set of images
=head1 SYNOPSIS
B<gen-xhtml-thumbnails> [I<directory>]
=head1 DESCRIPTION
gen-xhtml-thumbnails will create an F<index.xhtml> with a list (thumbnails) of
all images found if I<directory>; the thumbnails will link to the images.
The F<index.xhtml> file will always be created in I<directory>.
The thumbnails will be saved in F<.thumbs>, also in I<directory>.
If I<directory> is not specified, the current directory is used.
Note that only the images in the directory itself will be processed, recursion
is not supported.
|