-sub convert {
- my ($imgpath, $thumbpath, $cmds) = @_;
+sub dimensions ($imgpath) {
+ require IPC::Run;
+ IPC::Run::run(
+ [identify => -format => '%w %h', $$imgpath],
+ '<' => \undef, '>&' => \my $xy
+ ) or die ["Image dimensions could not be determined.", $$imgpath];
+ return split /\s/, $xy, 3;
+}
+
+sub generate ($imgpath, $thumbpath, $opt) {
+ my @cmds = @{$opt->{convert} // []};
+ unshift @cmds, -area => $_ for $opt->{crop32} || ();
+ $imgpath->convert($thumbpath, \@cmds, '300x200') and # low-res cover
+ $imgpath->convert($thumbpath =~ s/\.jpg$/.webp/r,
+ [@cmds, -quality => 40], '600x400' # higher dpi tradeoff
+ );
+}
- my $xyres = 0 ? '600x400' : '300x200'; # cover
- my @cmds = @{ $cmds // [] };
+sub convert ($imgpath, $thumbpath, $cmds, $xyres) {
+ #my ($w, $h) = $imgpath->dimensions;
+ #my $aspect = 3/2; # $xyres
+ my @cmds = @{$cmds};
if (my ($cmdarg) = grep { $cmds[$_] eq '-area' } 0 .. $#cmds) {
# replace option by permillage crop
my @dim = map { $_ / 1000 } split /\D/, $cmds[$cmdarg + 1];
$dim[$_] ||= 1 for 2, 3; # optional end
push @dim, $dim[2 + $_] - $dim[$_] for 0, 1; # add width, height
splice @cmds, $cmdarg, 2, (
if (my ($cmdarg) = grep { $cmds[$_] eq '-area' } 0 .. $#cmds) {
# replace option by permillage crop
my @dim = map { $_ / 1000 } split /\D/, $cmds[$cmdarg + 1];
$dim[$_] ||= 1 for 2, 3; # optional end
push @dim, $dim[2 + $_] - $dim[$_] for 0, 1; # add width, height
splice @cmds, $cmdarg, 2, (
-set => 'option:distort:viewport' => sprintf(
'%%[fx:%s]x%%[fx:%s]+%%[fx:%s]+%%[fx:%s]',
"w*$dim[4]", "h*$dim[5]", # width x height
-set => 'option:distort:viewport' => sprintf(
'%%[fx:%s]x%%[fx:%s]+%%[fx:%s]+%%[fx:%s]',
"w*$dim[4]", "h*$dim[5]", # width x height
"w*$dim[0]", "h*$dim[1]", # x+y offset
),
-distort => SRT => 0, # noop transform to apply viewport
"w*$dim[0]", "h*$dim[1]", # x+y offset
),
-distort => SRT => 0, # noop transform to apply viewport
-gravity => defined $cmds ? 'northwest' : 'center',
@cmds,
-resize => "$xyres^", -extent => $xyres,
-gravity => defined $cmds ? 'northwest' : 'center',
@cmds,
-resize => "$xyres^", -extent => $xyres,