This entry was posted on Saturday, February 7th, 2009 at 2:07 pm and is filed under development, howto. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Feb 7, 2009
HOWTO: PHP image resize, centered and cropped
Author: gaweee | Filed under: development, howtoSorry for not posting in such a long time folks, i just came back from the Pegasus galaxy. While working on a Joomla! 1.5 project, we had to develop a function to crop and resize images for obvious content management and aesthetic reasons. So i gathered around some good sources on PHP.net and wrote the following class:
class ImageHelper { static function treatFilename($filename) { $newfilename = strtolower($filename); $newfilename = str_replace(" ","_",$newfilename); return $newfilename; } static function isPotrait($srcimage) { if (!file_exists(realpath($srcimage))) return; return !ImageHelper::isLandscape($srcimage); } static function isLandscape($srcimage) { if (!file_exists(realpath($srcimage))) return; $size = getimagesize( $srcimage ); return ($size[0] > $size[1]); } static function resizeImage($srcimage, $destimage, $width, $height) { if (!file_exists(realpath($srcimage))) return; $srcpathinfo = pathinfo($srcimage); $srcext = strtolower($srcpathinfo['extension']); $destpathinfo = pathinfo($destimage); $destext = strtolower($destpathinfo['extension']); $size = getimagesize( $srcimage ); // Get the size of the original image into an array [0]=> width, [1]=> height $image = null; $canvas = imagecreatetruecolor( $width, $height ); // Prepare canvas // Create a new image in the memory from the file switch ($srcext) { case 'wbmp': case 'bmp': $image = imagecreatefromwbmp($srcimage); break; case 'jpg': case 'jpeg': $image = imagecreatefromjpeg($srcimage); break; case 'png': $image = imagecreatefrompng($srcimage); break; case 'gif': $image = imagecreatefromgif($srcimage); break; case 'xpm': $image = imagecreatefromxpm($srcimage); break; default: return; } // Calculate dimensions $widthratio = $size[0]/$width; $heightratio = $size[1]/$height; $dimensions = array( 'ratio' => $widthratio, 'source_cropwidth' => 0, 'source_cropheight' => 0, 'source_offsetx' => 0, 'source_offsety' => 0 ); if ($heightratio < $widthratio) $dimensions['ratio'] = $heightratio; // let say image is 1200*800, then: // widthratio = 1200/400 = 3 // heightratio = 800/300 = 2.66 // since there is less height than width, the max scale we can do is 2.66, then // the targetwidth to crop = 400 * 2.66 // the targetheight to crop = 300 * 2.66 // the offset width = (1200 - (2.66 * 400))/2 = 68 // the offset height = (800 - (2.66 * 300))/2 = 1 $dimensions['source_width'] = $size[0]; $dimensions['source_height'] = $size[1]; $dimensions['source_cropwidth'] = $width * $dimensions['ratio']; $dimensions['source_cropheight'] = $height * $dimensions['ratio']; $dimensions['source_offsetx'] = ($size[0] - $dimensions['source_cropwidth']) / 2; $dimensions['source_offsety'] = ($size[1] - $dimensions['source_cropheight']) / 2; imagecopyresampled($canvas, $image, 0, 0, $dimensions['source_offsetx'], $dimensions['source_offsety'], $width, $height, $dimensions['source_cropwidth'], $dimensions['source_cropheight']); switch ($destext) { case 'jpg': case 'jpeg': imagejpeg( $canvas, $destimage ); break; case 'png': imagepng( $canvas, $destimage ); break; case 'gif': imagegif( $canvas, $destimage ); break; case 'wbmp': case 'bmp': imagewbmp( $canvas, $destimage ); break; } imagedestroy( $canvas ); imagedestroy( $image ); return true; } }
use treatFilename to remove those pesky spaces, then use isPotrait or isLandscape to determine the orientation of the picture, then perform your resize accordingly. If your uploaded file input was called ulimage, then the code to resize your image would be:
$width = 150; $height = 150; if (is_uploaded_file(@$_FILES['ulimage']['tmp_name'])){ $targetfilename = ImageHelper::treatFilename(uniqid() . "_" . $_FILES['ulimage']['name']); move_uploaded_file($_FILES['ulimage']['tmp_name'], dirname(__FILE__) . "/tmp/" . $_FILES['ulimage']['name']); ImageHelper::resizeImage(dirname(__FILE__) . "/tmp/" . @$_FILES['ulimage']['name'], dirname(__FILE__) . "/tmp/" . $targetfilename, $width, $height); }
The reason you need to save the file first is for the imageResize function to infer the image type off its extension. I hadnt bothered to create an image type override.
read users' comments (0)
Leave a Reply
Most Popular
- HOWTO: PHP and jQuery upload progress bar (48)
- JQuery Progress Bar 1.1 (42)
- Howto: Repackageable custom extension development in Magento - Part 2 - Admin Controller (24)
- Howto: Repackageable custom extension development in Magento - Part 8 - CRUD - Update (16)
- HOWTO: struts 2 i18n (13)
- JQuery Progress Bar 2.0 (12)
- JQuery Progress Bar 1.2 (11)
- Howto: Repackageable custom extension development in Magento (9)
- Howto: Repackageable custom extension development in Magento - Part 3 - Database (9)
- Howto: Repackageable custom extension development in Magento - Part 9 - Frontend - List (8)
Recent Comments
- vid: @john: Unfortunately there has been
- john: With facebook's growth, more and
- vid: Thanks for the mention Josefina
- vid: Thanks Remo. The idea was
- Remo: Oh man not again. This
- learning methods: All the posts you talk
- best travel agency: Wow! I really enjoyed this
- Muzafar Ali: Hi, thanks for sharing a beautiful
- andy65007: After the progress bar
- Mark: Excellent tutorials. Most "how to
Latest Entries
- Attack of the Facebook Harvesters
- jQuery Progress Bar Configuration
- Extracting email addresses from inbox
- 10 Good (Free and Legal) Source for Photos and Images
- Howto: Backup Microsoft SQL Server Database, as in Dump it to a SQL Script (like MYSQL's sqldump)
- Managing client's expectation with wireframe software
- Howto: Repackageable custom extension development in Magento - Part 9 - Frontend - List
- JQuery Progress Bar 2.0
- HOWTO: Find icons for your new prototype system
- Google Maps Helper