diff options
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  | 
