Ok, so I'm making a site with a custom CMS and the people who will be inputting information typically try to hand me photos that are 4000 by 3000 pixels at 300dpi. This is obviously bad... I need to find a way to automatically make them smaller (but still nice-looking) both in file size and image dimensions as they are uploaded to free up space in the server and decrease loading time, etc.
Here's a function I wrote a few years ago (could probably do better now ) that should get you pointed in the right direction. You may want to see if the IMagick library is available, though, as I think it might be a bit more efficient with its memory. I know that with this function using the GD library, a 4000 x 3000 image will take up a lot of RAM, as GD creates a bitmap of the image in memory (width x height x 4 bytes, I think?).
PHP Code:
/** * Resize image to specific dimension, cropping as needed * @return resource Resized image resource, or boolean false on failure * @param string $imgFile Path to image to be resized * @param int $width * @param int $height * @param string $error Error message */ function resize($imgFile, $width, $height, &$error = null) { $attrs = @getimagesize($imgFile); if($attrs == false or $attrs[2] != IMG_JPEG) { $error = "Uploaded image is not JPEG or is not readable by this page."; return false; } if($attrs[0] * $attrs[1] > 3000000) { $error = "Max pixels allowed is 3,000,000. Your {$attrs[0]} x " . "{$attrs[1]} image has " . $attrs[0] * $attrs[1] . " pixels."; return false; } $ratio = (($attrs[0] / $attrs[1]) < ($width / $height)) ? $width / $attrs[0] : $height / $attrs[1]; $x = max(0, round($attrs[0] / 2 - ($width / 2) / $ratio)); $y = max(0, round($attrs[1] / 2 - ($height / 2) / $ratio)); $src = imagecreatefromjpeg($imgFile); if($src == false) { $error = "Unknown problem trying to open uploaded image."; return false; } $resized = imagecreatetruecolor($width, $height); $result = imagecopyresampled($resized, $src, 0, 0, $x, $y, $width, $height, round($width / $ratio, 0), round($height / $ratio)); if($result == false) { $error = "Error trying to resize and crop image."; return false; } else { return $resized; } }
"Please give us a simple answer, so that we don't have to think, because if we think, we might find answers that don't fit the way we want the world to be."
~ Terry Pratchett in Nation
Bookmarks