diff options
author | Silvio Rhatto <rhatto@riseup.net> | 2013-12-29 20:45:58 -0200 |
---|---|---|
committer | Silvio Rhatto <rhatto@riseup.net> | 2013-12-29 20:45:58 -0200 |
commit | 97e689213ff4e829f251af526ed4e796a3cc2b71 (patch) | |
tree | b04d03ec56305041216b72328fc9b5afde27bc76 /mod/lightpics/lib/resize.php | |
parent | 0ab6351abb7a602d96c62b0ad35413c88113a6cf (diff) | |
parent | 69e2d8c5d8732042c9319aef1fdea45a82b63e42 (diff) | |
download | elgg-97e689213ff4e829f251af526ed4e796a3cc2b71.tar.gz elgg-97e689213ff4e829f251af526ed4e796a3cc2b71.tar.bz2 |
Merge branch 'master' into saravea
Conflicts:
.gitmodules
mod/admins
mod/assemblies
mod/audio_html5
mod/beechat
mod/crud
mod/elgg-activitystreams
mod/elggman
mod/elggpg
mod/favorites
mod/federated-objects
mod/friendly_time
mod/group_alias
mod/group_operators
mod/languages
mod/lightpics
mod/openid_client
mod/spotlight
mod/suicide
mod/tasks
mod/videolist
Diffstat (limited to 'mod/lightpics/lib/resize.php')
-rw-r--r-- | mod/lightpics/lib/resize.php | 522 |
1 files changed, 522 insertions, 0 deletions
diff --git a/mod/lightpics/lib/resize.php b/mod/lightpics/lib/resize.php new file mode 100644 index 000000000..aa2eabea1 --- /dev/null +++ b/mod/lightpics/lib/resize.php @@ -0,0 +1,522 @@ +<?php +/** + * Elgg tidypics library of resizing functions + * + * @package TidypicsImageResize + */ + + +/** + * Create thumbnails using PHP GD Library + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_gd_thumbnails($file, $prefix, $filestorename) { + global $CONFIG; + + $image_sizes = elgg_get_plugin_setting('image_sizes', 'lightpics'); + if (!$image_sizes) { + // move this out of library + register_error(elgg_echo('tidypics:nosettings')); + forward(REFERER); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['tiny_image_width'], + $image_sizes['tiny_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + // album thumbnail + global $CONFIG; + $CONFIG->debug = 'WARNING'; + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + unset($CONFIG->debug); + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + + unset($thumb); + + return TRUE; +} + +/** + * Writes resized version of an already uploaded image - original from Elgg filestore.php + * Saves it in the same format as uploaded + * + * @param string $input_name The name of the file on the disk + * @param string $output_name The name of the file to be written + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool TRUE on success or FALSE on failure + */ +function tp_gd_resize($input_name, $output_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height of image + $width = $imgsizearray[0]; + $height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($width, $height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $new_width = $params['new_width']; + $new_height = $params['new_height']; + $region_width = $params['region_width']; + $region_height = $params['region_height']; + $widthoffset = $params['width_offset']; + $heightoffset = $params['height_offset']; + + $accepted_formats = array( + 'image/jpeg' => 'jpeg', + 'image/pjpeg' => 'jpeg', + 'image/png' => 'png', + 'image/x-png' => 'png', + 'image/gif' => 'gif' + ); + + // make sure the function is available + $function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']]; + if (!is_callable($function)) { + return FALSE; + } + + // load old image + $oldimage = $function($input_name); + if (!$oldimage) { + return FALSE; + } + + // allocate the new image + $newimage = imagecreatetruecolor($new_width, $new_height); + if (!$newimage) { + return FALSE; + } + + $rtn_code = imagecopyresampled( $newimage, + $oldimage, + 0, + 0, + $widthoffset, + $heightoffset, + $new_width, + $new_height, + $region_width, + $region_height); + if (!$rtn_code) { + return $rtn_code; + } + + switch ($imgsizearray['mime']) { + case 'image/jpeg': + case 'image/pjpeg': + $rtn_code = imagejpeg($newimage, $output_name, 85); + break; + case 'image/png': + case 'image/x-png': + $rtn_code = imagepng($newimage, $output_name); + break; + case 'image/gif': + $rtn_code = imagegif($newimage, $output_name); + break; + } + + imagedestroy($newimage); + imagedestroy($oldimage); + + return $rtn_code; +} + + +/** + * Create thumbnails using PHP imagick extension + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_imagick_thumbnails($file, $prefix, $filestorename) { + $image_sizes = elgg_get_plugin_setting('image_sizes', 'tidypics'); + if (!$image_sizes) { + register_error(elgg_echo('tidypics:nosettings')); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbnail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['tiny_image_width'], + $image_sizes['tiny_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + // album thumbnail + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + unset($thumb); + + return TRUE; +} + + +/** + * Resize using PHP imagick extension + * + * Writes resized version of an already uploaded image + * + * + * @param string $input_name The name of the file input field on the submission form + * @param string $output_name The name of the file to be written + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool TRUE on success + */ +function tp_imagick_resize($input_name, $output_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height + $width = $imgsizearray[0]; + $height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($width, $height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $new_width = $params['new_width']; + $new_height = $params['new_height']; + $region_width = $params['region_width']; + $region_height = $params['region_height']; + $widthoffset = $params['width_offset']; + $heightoffset = $params['height_offset']; + + try { + $img = new Imagick($input_name); + } catch (ImagickException $e) { + return FALSE; + } + + $img->cropImage($region_width, $region_height, $widthoffset, $heightoffset); + + // use the default IM filter (windowing filter), I think 1 means default blurring or number of lobes + $img->resizeImage($new_width, $new_height, imagick::FILTER_LANCZOS, 1); + $img->setImagePage($new_width, $new_height, 0, 0); + + if ($img->writeImage($output_name) != TRUE) { + $img->destroy(); + return FALSE; + } + + $img->destroy(); + + return TRUE; +} + +/** + * Create thumbnails using ImageMagick executables + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_im_cmdline_thumbnails($file, $prefix, $filestorename) { + $image_sizes = elgg_get_plugin_setting('image_sizes', 'tidypics'); + if (!$image_sizes) { + register_error(elgg_echo('tidypics:nosettings')); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbnail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['tiny_image_width'], + $image_sizes['tiny_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + + // album thumbnail + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + unset($thumb); + + return TRUE; +} + +/** + * Gets the jpeg contents of the resized version of an already uploaded image + * (Returns FALSE if the uploaded file was not an image) + * + * @param string $input_name The name of the file input field on the submission form + * @param string $output_name The name of the file to be written + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool + */ +function tp_im_cmdline_resize($input_name, $output_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height + $orig_width = $imgsizearray[0]; + $orig_height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($orig_width, $orig_height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $newwidth = $params['new_width']; + $newheight = $params['new_height']; + + $accepted_formats = array( + 'image/jpeg' => 'jpeg', + 'image/pjpeg' => 'jpeg', + 'image/png' => 'png', + 'image/x-png' => 'png', + 'image/gif' => 'gif' + ); + + // If it's a file we can manipulate ... + if (!array_key_exists($imgsizearray['mime'],$accepted_formats)) { + return FALSE; + } + + $im_path = elgg_get_plugin_setting('im_path', 'tidypics'); + if (!$im_path) { + $im_path = "/usr/bin/"; + } + if (substr($im_path, strlen($im_path)-1, 1) != "/") { + $im_path .= "/"; + } + + // see imagemagick web site for explanation of these parameters + // the ^ in the resize means those are minimum width and height values + $command = $im_path . "convert \"$input_name\" -resize ".$newwidth."x".$newheight."^ -gravity center -extent ".$newwidth."x".$newheight." \"$output_name\""; + $output = array(); + $ret = 0; + exec($command, $output, $ret); + if ($ret == 127) { + trigger_error('Tidypics warning: Image Magick convert is not found', E_USER_WARNING); + return FALSE; + } else if ($ret > 0) { + trigger_error('Tidypics warning: Image Magick convert failed', E_USER_WARNING); + return FALSE; + } + + return TRUE; +} + +/** + * Calculate the resizing/cropping parameters + * + * @param int $orig_width + * @param int $orig_height + * @param int $new_width + * @param int $new_height + * @param bool $square + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @return array|FALSE + */ +function tp_im_calc_resize_params($orig_width, $orig_height, $new_width, $new_height, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + // crop image first? + $crop = TRUE; + if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 == 0) { + $crop = FALSE; + } + + // how large a section of the image has been selected + if ($crop) { + $region_width = $x2 - $x1; + $region_height = $y2 - $y1; + } else { + // everything selected if no crop parameters + $region_width = $orig_width; + $region_height = $orig_height; + } + + // determine cropping offsets + if ($square) { + // asking for a square image back + + // detect case where someone is passing crop parameters that are not for a square + if ($crop == TRUE && $region_width != $region_height) { + return FALSE; + } + + // size of the new square image + $new_width = $new_height = min($new_width, $new_height); + + // find largest square that fits within the selected region + $region_width = $region_height = min($region_width, $region_height); + + // set offsets for crop + if ($crop) { + $widthoffset = $x1; + $heightoffset = $y1; + $orig_width = $x2 - $x1; + $orig_height = $orig_width; + } else { + // place square region in the center + $widthoffset = floor(($orig_width - $region_width) / 2); + $heightoffset = floor(($orig_height - $region_height) / 2); + } + } else { + // non-square new image + + // maintain aspect ratio of original image/crop + if (($region_height / (float)$new_height) > ($region_width / (float)$new_width)) { + $new_width = floor($new_height * $region_width / (float)$region_height); + } else { + $new_height = floor($new_width * $region_height / (float)$region_width); + } + + // by default, use entire image + $widthoffset = 0; + $heightoffset = 0; + + if ($crop) { + $widthoffset = $x1; + $heightoffset = $y1; + } + } + + $resize_params = array(); + $resize_params['new_width'] = $new_width; + $resize_params['new_height'] = $new_height; + $resize_params['region_width'] = $region_width; + $resize_params['region_height'] = $region_height; + $resize_params['width_offset'] = $widthoffset; + $resize_params['height_offset'] = $heightoffset; + + return $resize_params; +}
\ No newline at end of file |