From f42215cb65173299bca13cd8bafabdcb9ad2ab2d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 27 Sep 2009 20:53:02 -0400 Subject: 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.) --- IkiWiki/Plugin/img.pm | 109 +++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 55 deletions(-) (limited to 'IkiWiki/Plugin') 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='