aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--admin/include/functions_upload.inc.php102
1 files changed, 81 insertions, 21 deletions
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php
index 94116a3b4..d04e04c01 100644
--- a/admin/include/functions_upload.inc.php
+++ b/admin/include/functions_upload.inc.php
@@ -183,6 +183,9 @@ function prepare_directory($directory)
function need_resize($image_filepath, $max_width, $max_height)
{
+ // TODO : the resize check should take the orientation into account. If a
+ // rotation must be applied to the resized photo, then we should test
+ // invert width and height.
list($width, $height) = getimagesize($image_filepath);
if ($width > $max_width or $height > $max_height)
@@ -193,6 +196,48 @@ function need_resize($image_filepath, $max_width, $max_height)
return false;
}
+function get_resize_dimensions($width, $height, $max_width, $max_height, $rotation=null)
+{
+ $rotate_for_dimensions = false;
+ if (isset($rotation) and in_array(abs($rotation), array(90, 270)))
+ {
+ $rotate_for_dimensions = true;
+ }
+
+ if ($rotate_for_dimensions)
+ {
+ list($width, $height) = array($height, $width);
+ }
+
+ $ratio_width = $width / $max_width;
+ $ratio_height = $height / $max_height;
+
+ // maximal size exceeded ?
+ if ($ratio_width > 1 or $ratio_height > 1)
+ {
+ if ($ratio_width < $ratio_height)
+ {
+ $destination_width = ceil($width / $ratio_height);
+ $destination_height = $max_height;
+ }
+ else
+ {
+ $destination_width = $max_width;
+ $destination_height = ceil($height / $ratio_width);
+ }
+ }
+
+ if ($rotate_for_dimensions)
+ {
+ list($destination_width, $destination_height) = array($destination_height, $destination_width);
+ }
+
+ return array(
+ 'width' => $destination_width,
+ 'height'=> $destination_height,
+ );
+}
+
function pwg_image_resize($result, $source_filepath, $destination_filepath, $max_width, $max_height, $quality)
{
if ($result !== false)
@@ -222,36 +267,45 @@ function pwg_image_resize($result, $source_filepath, $destination_filepath, $max
{
die('unsupported file extension');
}
+
+ $rotation = null;
+ if (function_exists('imagerotate'))
+ {
+ $exif = exif_read_data($source_filepath);
+ if (isset($exif['Orientation']) and preg_match('/^\s*(\d)/', $exif['Orientation'], $matches))
+ {
+ $orientation = $matches[1];
+ if (in_array($orientation, array(3, 4)))
+ {
+ $rotation = 180;
+ }
+ elseif (in_array($orientation, array(5, 6)))
+ {
+ $rotation = 270;
+ }
+ elseif (in_array($orientation, array(7, 8)))
+ {
+ $rotation = 90;
+ }
+ }
+ }
// width/height
$source_width = imagesx($source_image);
$source_height = imagesy($source_image);
- $ratio_width = $source_width / $max_width;
- $ratio_height = $source_height / $max_height;
-
- // maximal size exceeded ?
- if ($ratio_width > 1 or $ratio_height > 1)
- {
- if ($ratio_width < $ratio_height)
- {
- $destination_width = ceil($source_width / $ratio_height);
- $destination_height = $max_height;
- }
- else
- {
- $destination_width = $max_width;
- $destination_height = ceil($source_height / $ratio_width);
- }
- }
- else
+ $resize_dimensions = get_resize_dimensions($source_width, $source_height, $max_width, $max_height, $rotation);
+
+ // testing on height is useless in theory: if width is unchanged, there
+ // should be no resize, because width/height ratio is not modified.
+ if ($resize_dimensions['width'] == $source_width and $resize_dimensions['height'] == $source_height)
{
// the image doesn't need any resize! We just copy it to the destination
copy($source_filepath, $destination_filepath);
return true;
}
- $destination_image = imagecreatetruecolor($destination_width, $destination_height);
+ $destination_image = imagecreatetruecolor($resize_dimensions['width'], $resize_dimensions['height']);
imagecopyresampled(
$destination_image,
@@ -260,11 +314,17 @@ function pwg_image_resize($result, $source_filepath, $destination_filepath, $max
0,
0,
0,
- $destination_width,
- $destination_height,
+ $resize_dimensions['width'],
+ $resize_dimensions['height'],
$source_width,
$source_height
);
+
+ // rotation occurs only on resized photo to avoid useless memory use
+ if (isset($rotation))
+ {
+ $destination_image = imagerotate($destination_image, $rotation, 0);
+ }
$extension = strtolower(get_extension($destination_filepath));
if ($extension == 'png')