diff options
author | Joey Hess <joey@gnu.kitenet.net> | 2009-09-27 20:53:02 -0400 |
---|---|---|
committer | Joey Hess <joey@gnu.kitenet.net> | 2009-09-27 20:53:02 -0400 |
commit | f42215cb65173299bca13cd8bafabdcb9ad2ab2d (patch) | |
tree | be4bc3e67e9cf70316fdf4b34032e852c5c50c6c /IkiWiki/Plugin | |
parent | 1a366910d30a0ff07a16f3d0505e0584a63a465a (diff) |
img: Correct bug in image size calculation code.
If an image was resized smaller, with width and height specified to values
that did not fit its aspect ratio, the image tag with/height were not
adjusted to the actual size imagemagick chooses.
This was broken by 03449610d6c666ba24bea68f01d896613e522278.
To fix it right, it unfortunatly needs to always read the src image now,
in order to determine if the image is being displayed larger, or resized
smaller. When resized smaller, it then always uses the size of the
thumbnail, while for larger it calculates the size.
(Only way to get rid of this sometimes extra image read would be to change
it to not allow displaying images larger.)
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/img.pm | 109 |
1 files changed, 54 insertions, 55 deletions
diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm index 9ae85c4e6..223b5a11f 100644 --- a/IkiWiki/Plugin/img.pm +++ b/IkiWiki/Plugin/img.pm @@ -63,8 +63,9 @@ sub preprocess (@) { error gettext("Image::Magick is not installed") if $@; my $im = Image::Magick->new; my $imglink; - my $r; - + my $r = $im->Read($srcfile); + error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r; + my ($dwidth, $dheight); if ($params{size} ne 'full') { @@ -74,69 +75,71 @@ sub preprocess (@) { error sprintf(gettext('wrong size format "%s" (should be WxH)'), $params{size}) unless (defined $w && defined $h && (length $w || length $h)); - - my $outfile = "$config{destdir}/$dir/${w}x${h}-$base"; - $imglink = "$dir/${w}x${h}-$base"; - will_render($params{page}, $imglink); - - if (-e $outfile && (-M $srcfile >= -M $outfile)) { - $r = $im->Read($outfile); - error sprintf(gettext("failed to read %s: %s"), $outfile, $r) if $r; + if ((length $w && $w > $im->Get("width")) || + (length $h && $h > $im->Get("height"))) { + # resizing larger + $imglink = $file; + + # don't generate larger image, just set display size + if (length $w && length $h) { + ($dwidth, $dheight)=($w, $h); + } + # avoid division by zero on 0x0 image + elsif ($im->Get("width") == 0 || $im->Get("height") == 0) { + ($dwidth, $dheight)=(0, 0); + } + # calculate unspecified size from the other one, preserving + # aspect ratio + elsif (length $w) { + $dwidth=$w; + $dheight=$w / $im->Get("width") * $im->Get("height"); + } + elsif (length $h) { + $dheight=$h; + $dwidth=$h / $im->Get("height") * $im->Get("width"); + } } else { - $r = $im->Read($srcfile); - error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r; - - # don't resize any larger - my ($rw, $rh) = ($w, $h); - if ((length $rw && $rw > $im->Get("width")) || - (length $rh && $rh > $im->Get("height"))) { - $rw=$im->Get("width"); - $rh=$im->Get("height"); - } - - $r = $im->Resize(geometry => "${rw}x${rh}"); - error sprintf(gettext("failed to resize: %s"), $r) if $r; + # resizing smaller + my $outfile = "$config{destdir}/$dir/${w}x${h}-$base"; + $imglink = "$dir/${w}x${h}-$base"; + + will_render($params{page}, $imglink); - # don't actually write file in preview mode - if (! $params{preview}) { - my @blob = $im->ImageToBlob(); - writefile($imglink, $config{destdir}, $blob[0], 1); + if (-e $outfile && (-M $srcfile >= -M $outfile)) { + $im = Image::Magick->new; + $r = $im->Read($outfile); + error sprintf(gettext("failed to read %s: %s"), $outfile, $r) if $r; + + $dwidth = $im->Get("width"); + $dheight = $im->Get("height"); } else { - $imglink = $file; + ($dwidth, $dheight)=($w, $h); + $r = $im->Resize(geometry => "${w}x${h}"); + error sprintf(gettext("failed to resize: %s"), $r) if $r; + + # don't actually write file in preview mode + if (! $params{preview}) { + my @blob = $im->ImageToBlob(); + writefile($imglink, $config{destdir}, $blob[0], 1); + } + else { + $imglink = $file; + } } } - - # since we don't really resize larger, set the display - # size, so the browser can scale the image up if necessary - if (length $w && length $h) { - ($dwidth, $dheight)=($w, $h); - } - # avoid division by zero on 0x0 image - elsif ($im->Get("width") == 0 || $im->Get("height") == 0) { - ($dwidth, $dheight)=(0, 0); - } - # calculate unspecified size from the other one, preserving - # aspect ratio - elsif (length $w) { - $dwidth=$w; - $dheight=$w / $im->Get("width") * $im->Get("height"); - } - elsif (length $h) { - $dheight=$h; - $dwidth=$h / $im->Get("height") * $im->Get("width"); - } - } else { - $r = $im->Read($srcfile); - error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r; $imglink = $file; $dwidth = $im->Get("width"); $dheight = $im->Get("height"); } + + if (! defined($dwidth) || ! defined($dheight)) { + error sprintf(gettext("failed to determine size of image %s"), $file) + } my ($fileurl, $imgurl); if (! $params{preview}) { @@ -148,10 +151,6 @@ sub preprocess (@) { $imgurl="$config{url}/$imglink"; } - if (! defined($im->Get("width")) || ! defined($im->Get("height"))) { - error sprintf(gettext("failed to determine size of image %s"), $file) - } - my $imgtag='<img src="'.$imgurl. '" width="'.$dwidth. '" height="'.$dheight.'"'. |