Tuesday, April 19, 2011

Image resize and thubnail with PHP - functions

As websites are getting more and more feature enabled and fully loaded with the multimedia, the need of managing the media like, Music, Images, Videos is increasing day by day. One of the most used media is Images. Image gallerias, Slideshows, light-boxes are common every site. Each of this task is going to need the image resize or creating smaller thumbnails to display. So here is a small function with which you can easily create thumbnails from the image. The following function can resize and crop the image dimensionally or just creating a perfect square.

/**
 * Gets the jpeg contents of the resized version of an already uploaded image
 * (Returns false if the file was not an image)
 *
 * @param string $input_name The name of the file on the disk
 * @param int    $maxwidth   The desired width of the resized image
 * @param int    $maxheight  The desired height of the resized image
 * @param bool   $square     If set to true, takes the smallest of maxwidth and
 *                 maxheight and use it to set the dimensions on the new image.
 *                           If no crop parameters are set, the largest square that fits
 *                           in the image centered will be used for the resize. If square,
 *                           the crop must be a square region.
 * @param int    $x1         x coordinate for top, left corner
 * @param int    $y1         y coordinate for top, left corner
 * @param int    $x2         x coordinate for bottom, right corner
 * @param int    $y2         y coordinate for bottom, right corner
 * @param bool   $upscale    Resize images smaller than $maxwidth x $maxheight?
 *
 * @return false|mixed The contents of the resized image, or false on failure
 */
function get_resized_image_from_existing_file($input_name, $maxwidth, $maxheight, $square = FALSE,
$x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0, $upscale = FALSE) {

// Get the size information from the image
$imgsizearray = getimagesize($input_name);
if ($imgsizearray == FALSE) {
return FALSE;
}

$width = $imgsizearray[0];
$height = $imgsizearray[1];

$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
$load_function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
if (!is_callable($load_function)) {
return FALSE;
}

// get the parameters for resizing the image
$options = array(
'maxwidth' => $maxwidth,
'maxheight' => $maxheight,
'square' => $square,
'upscale' => $upscale,
'x1' => $x1,
'y1' => $y1,
'x2' => $x2,
'y2' => $y2,
);
$params = get_image_resize_parameters($width, $height, $options);
if ($params == FALSE) {
return FALSE;
}

// load original image
$original_image = $load_function($input_name);
if (!$original_image) {
return FALSE;
}

// allocate the new image
$new_image = imagecreatetruecolor($params['newwidth'], $params['newheight']);
if (!$new_image) {
return FALSE;
}

$rtn_code = imagecopyresampled( $new_image,
$original_image,
0,
0,
$params['xoffset'],
$params['yoffset'],
$params['newwidth'],
$params['newheight'],
$params['selectionwidth'],
$params['selectionheight']);
if (!$rtn_code) {
return FALSE;
}

// grab a compressed jpeg version of the image
ob_start();
imagejpeg($new_image, NULL, 90);
$jpeg = ob_get_clean();

imagedestroy($new_image);
imagedestroy($original_image);

return $jpeg;
}

/**
 * Calculate the parameters for resizing an image
 *
 * @param int   $width   Width of the original image
 * @param int   $height  Height of the original image
 * @param array $options See $defaults for the options
 *
 * @return array or FALSE
 */

function get_image_resize_parameters($width, $height, $options) {

$defaults = array(
'maxwidth' => 100,
'maxheight' => 100,

'square' => FALSE,
'upscale' => FALSE,

'x1' => 0,
'y1' => 0,
'x2' => 0,
'y2' => 0,
);

$options = array_merge($defaults, $options);

extract($options);

// 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) {
$selection_width = $x2 - $x1;
$selection_height = $y2 - $y1;
} else {
// everything selected if no crop parameters
$selection_width = $width;
$selection_height = $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 && $selection_width != $selection_height) {
return FALSE;
}

// size of the new square image
$new_width = $new_height = min($maxwidth, $maxheight);

// find largest square that fits within the selected region
$selection_width = $selection_height = min($selection_width, $selection_height);

// set offsets for crop
if ($crop) {
$widthoffset = $x1;
$heightoffset = $y1;
$width = $x2 - $x1;
$height = $width;
} else {
// place square region in the center
$widthoffset = floor(($width - $selection_width) / 2);
$heightoffset = floor(($height - $selection_height) / 2);
}
} else {
// non-square new image
$new_width = $maxwidth;
$new_height = $maxheight;

// maintain aspect ratio of original image/crop
if (($selection_height / (float)$new_height) > ($selection_width / (float)$new_width)) {
$new_width = floor($new_height * $selection_width / (float)$selection_height);
} else {
$new_height = floor($new_width * $selection_height / (float)$selection_width);
}

// by default, use entire image
$widthoffset = 0;
$heightoffset = 0;

if ($crop) {
$widthoffset = $x1;
$heightoffset = $y1;
}
}

if (!$upscale && ($selection_height < $new_height || $selection_width < $new_width)) {
// we cannot upscale and selected area is too small so we decrease size of returned image
if ($square) {
$new_height = $selection_height;
$new_width = $selection_width;
} else {
if ($selection_height < $new_height && $selection_width < $new_width) {
$new_height = $selection_height;
$new_width = $selection_width;
}
}
}

$params = array(
'newwidth' => $new_width,
'newheight' => $new_height,
'selectionwidth' => $selection_width,
'selectionheight' => $selection_height,
'xoffset' => $widthoffset,
'yoffset' => $heightoffset,
);

return $params;
}

Enjoy guys.. And please don't forget to comment back if it helps you..
Thanks

2 comments: