diff options
Diffstat (limited to 'admin')
-rw-r--r-- | admin/include/functions_upload.inc.php | 102 |
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') |