Pioden Posted May 27, 2008 Share Posted May 27, 2008 Hi all, I'm trying to mod imagemagick_class so that it automatically generates a thumbnail of any image I upload to the server. I've hacked around some of the code from the class but without success. I wonder if anyone has time to help me with this as I'm sure this feature would be helpful for a lot of people. These are the mods I've made so far ... I added $tndir for the thumbnail directory class ImageMagick { var $targetdir = '$img_path'; var $tndir = '$img_path.tn/'; var $imagemagickdir = '$pathtomagick'; var $temp_dir = '/tmp'; // httpd must be able to write there var $file_history = array(); var $temp_file = ''; var $jpg_quality = '55'; var $count = 0; var $image_data = array(); var $error = ''; var $verbose = FALSE; and I 'created' this function function ResizeTN(120, 90, $how='fit') { $method = $how=='keep_aspect'?'>'$how=='fit'?'!':''); $command = "{$this->imagemagickdir}/convert -geometry '{$x_size}x{$y_size}{$method}' '{$this->temp_dir}/tmp{$this->count}_{$this->temp_file}' '{$this->temp_dir}/tmp".++$this->count."_{$this->temp_file}'"; exec($command, $returnarray, $returnvalue); } else { $this->file_history[] = $this->temp_dir.'/tmp'.$this->count.'_'.$this->temp_file; } } $prefix='tn'; if(!@copy($this->temp_dir.'/tmp'.$this->count.'_'.$this->temp_file, $this->tndir.'/'.$prefix.$this->temp_file)) { $this->error .= "ImageMagick: Couldn't save to {$this->targetdir}/'{$prefix}{$this->temp_file}\n"; } else { } return $prefix.$this->temp_file; } Any help getting this to work would be great. I've attached a copy of the full class. TIA Huw [attachment deleted by admin] Quote Link to comment Share on other sites More sharing options...
Pioden Posted May 27, 2008 Author Share Posted May 27, 2008 Shamelessly bumping this before it falls of the end of the page ... Quote Link to comment Share on other sites More sharing options...
BlueSkyIS Posted May 27, 2008 Share Posted May 27, 2008 fwiw, this class has been posted on here before: /** * A class providing a set of methods for doing basic transformation to an image like resizing, rotating and flipping * * The code is approx 18Kb in size but still heavily documented so you can easily understand every aspect of it * * * */ error_reporting(E_ALL); class imageTransform { /** * Path and name of image file to transform * * @var string */ var $sourceFile = ""; /** * Path and name of transformed image file * * @var string */ var $targetFile = ""; /** * Available only for the {@link resize} method * * Width, in pixels, to resize the image to * * the property will not be taken into account if is set to -1 * * default is -1 * * @var integer */ var $resizeToWidth = -1; /** * Available only for the {@link resize} method * * Height, in pixels, to resize the image to * * the property will not be taken into account if is set to -1 * * default is -1 * * @var integer */ var $resizeToHeight = -1; /** * Available only for the {@link resize} method * * while resizing, image will keep it's aspect ratio if this property is set to TRUE, and only one of the * {@link resizeToWidth} or {@link resizeToHeight} properties is set. if set to TRUE, and both * {@link resizeToWidth} or {@link resizeToHeight} properties are set, the image will be resized to maximum width/height * so that neither one of them will exceed given width/height while keeping the aspect ratio * * default is TRUE * * @var boolean */ var $maintainAspectRatio = true; /** * Available only for the {@link resize} method * * image is resized only if image width/height is smaller than the values of * {@link resizeToWidth}/{@link resizeToHeight} properties * * @var boolean */ var $resizeIfSmaller = true; /** * Available only for the {@link resize} method * * image is resized only if image width/height is greater than the values of * {@link resizeToWidth}/{@link resizeToHeight} properties * * @var boolean */ var $resizeIfGreater = true; /** * Available only for the {@link resize} method and only if the {@link targetFile}'s extension is jpg/jpeg * * output quality of image (better quality means bigger file size). * * range is 0 - 100 * * default is 65 * * @var integer */ var $jpegOutputQuality = 65; /** * what rights should the transformed file have * * by default a file created by a script will have the script as owner and you would not be able to edit, modify * or delete the file. better is to leave this setting as it is * * @var string */ var $chmodValue = "0650"; /** * in case of an error read this property's value to find out what went wrong * * possible error values are: * * - 1: source file could not be found * - 2: source file can not be read * - 3: could not write target file * - 4: unsupported source file * - 5: unsupported target file * - 6: available version of GD does not support target file extension * * @var integer */ var $error = 0; /** * returns an image identifier representing the image obtained from sourceFile and the image's width and height * * @access private */ function create_image_from_source_file() { // performs some error checking first // if source file does not exists if (!file_exists($this->sourceFile)) { // save the error level and stop the execution of the script $this->error = 1; return false; // if source file is not readable } elseif (!is_readable($this->sourceFile)) { // save the error level and stop the execution of the script $this->error = 2; return false; // if target file is same as source file and source file is not writable } elseif ($this->targetFile == $this->sourceFile && !is_writable($this->sourceFile)) { // save the error level and stop the execution of the script $this->error = 3; return false; // get source file width, height and type // and if founds a not-supported file type } elseif (!list($sourceImageWidth, $sourceImageHeight, $sourceImageType) = getimagesize($this->sourceFile)) { // save the error level and stop the execution of the script $this->error = 4; return false; // if no errors so far } else { // creates an image from file using extension dependant function // checks for file extension switch ($sourceImageType) { // if gif case 1: // the following part gets the transparency color for a gif file // this code is from the PHP manual and is written by // fred at webblake dot net and webmaster at webnetwizard dotco dotuk, thanks! $fp = fopen($this->sourceFile, "rb"); $result = fread($fp, 13); $colorFlag = ord(substr($result,10,1)) >> 7; $background = ord(substr($result,11)); if ($colorFlag) { $tableSizeNeeded = ($background + 1) * 3; $result = fread($fp, $tableSizeNeeded); $this->transparentColorRed = ord(substr($result, $background * 3, 1)); $this->transparentColorGreen = ord(substr($result, $background * 3 + 1, 1)); $this->transparentColorBlue = ord(substr($result, $background * 3 + 2, 1)); } fclose($fp); // -- here ends the code related to transparency handling // creates an image from file $sourceImageIdentifier = @imagecreatefromgif($this->sourceFile); break; // if jpg case 2: // creates an image from file $sourceImageIdentifier = @imagecreatefromjpeg($this->sourceFile); break; // if png case 3: // creates an image from file $sourceImageIdentifier = @imagecreatefrompng($this->sourceFile); break; default: // if file has an unsupported extension // note that we call this if the file is not gif, jpg or png even though the getimagesize function // handles more image types $this->error = 4; return false; } } // returns an image identifier representing the image obtained from sourceFile and the image's width and height return array($sourceImageIdentifier, $sourceImageWidth, $sourceImageHeight); } /** * Creates a target image identifier * * @access private */ function create_target_image_identifier($width, $height) { // creates a blank image $targetImageIdentifier = imagecreatetruecolor($width, $height); // if we have transparency in the image if (isset($this->transparentColorRed) && isset($this->transparentColorGreen) && isset($this->transparentColorBlue)) { $transparent = imagecolorallocate($targetImageIdentifier, $this->transparentColorRed, $this->transparentColorGreen, $this->transparentColorBlue); imagefilledrectangle($targetImageIdentifier, 0, 0, $width, $height, $transparent); imagecolortransparent($targetImageIdentifier, $transparent); } // return target image identifier return $targetImageIdentifier; } /** * creates a new image from a given image identifier * * @access private */ function output_target_image($targetImageIdentifier) { // get target file extension $targetFileExtension = strtolower(substr($this->targetFile, strrpos($this->targetFile, ".") + 1)); // image saving process goes according to required extension switch ($targetFileExtension) { // if gif case "gif": // if gd support for this file type is not available if (!function_exists("imagegif")) { // save the error level and stop the execution of the script $this->error = 6; return false; // if, for some reason, file could not be created } elseif (@!imagegif($targetImageIdentifier, $this->targetFile)) { // save the error level and stop the execution of the script $this->error = 3; return false; } break; // if jpg case "jpg": case "jpeg": // if gd support for this file type is not available if (!function_exists("imagejpeg")) { // save the error level and stop the execution of the script $this->error = 6; return false; // if, for some reason, file could not be created } elseif (@!imagejpeg($targetImageIdentifier, $this->targetFile, $this->jpegOutputQuality)) { // save the error level and stop the execution of the script $this->error = 3; return false; } break; case "png": // if gd support for this file type is not available if (!function_exists("imagepng")) { // save the error level and stop the execution of the script $this->error = 6; return false; // if, for some reason, file could not be created } elseif (@!imagepng($targetImageIdentifier, $this->targetFile)) { // save the error level and stop the execution of the script $this->error = 3; return false; } // if not a supported file extension default: // save the error level and stop the execution of the script $this->error = 5; return false; } // if file was created successfully // chmod the file chmod($this->targetFile, $this->chmodValue); // and return true return true; } /** * Resizes the image given as {@link sourceFile} and outputs the resulted image as {@link targetFile} * while following user specified properties * * @return boolean TRUE on success, FALSE on error. * If FALSE is returned, check the {@link error} property to see what went wrong */ function resize() { // creates an image from sourceFile list($sourceImageIdentifier, $sourceImageWidth, $sourceImageHeight) = $this->create_image_from_source_file(); // if aspect ratio needs to be maintained if ($this->maintainAspectRatio) { // calculates image's aspect ratio $aspectRatio = $sourceImageWidth <= $sourceImageHeight ? $sourceImageHeight / $sourceImageWidth : $sourceImageWidth / $sourceImageHeight; $targetImageWidth = $sourceImageWidth; $targetImageHeight = $sourceImageHeight; // if width of image is greater than resizeToWidth property and resizeIfGreater property is TRUE // or width of image is smaller than resizeToWidth property and resizeIfSmaller property is TRUE if ( ($this->resizeToWidth >= 0 && $targetImageWidth > $this->resizeToWidth && $this->resizeIfGreater) || ($this->resizeToWidth >= 0 && $targetImageWidth < $this->resizeToWidth && $this->resizeIfSmaller) ) { // set the width of target image $targetImageWidth = $this->resizeToWidth; // set the height of target image so that the image will keep its aspect ratio $targetImageHeight = $sourceImageWidth <= $sourceImageHeight ? $targetImageWidth * $aspectRatio : $targetImageWidth / $aspectRatio; } // if height of image is greater than resizeToHeight property and resizeIfGreater property is TRUE // or height of image is smaller than resizeToHeight property and resizeIfSmaller property is TRUE if ( ($this->resizeToHeight >= 0 && $targetImageHeight > $this->resizeToHeight && $this->resizeIfGreater) || ($this->resizeToHeight >= 0 && $targetImageHeight < $this->resizeToHeight && $this->resizeIfSmaller) ) { // set the width of target image $targetImageHeight = $this->resizeToHeight; // set the width of target image so that the image will keep its aspect ratio $targetImageWidth = $sourceImageWidth <= $sourceImageHeight ? $targetImageHeight / $aspectRatio : $targetImageHeight * $aspectRatio; } // if aspect ratio does not need to be maintained } else { $targetImageWidth = ($this->resizeToWidth >= 0 ? $this->resizeToWidth : $sourceImageWidth); $targetImageHeight = ($this->resizeToHeight >= 0 ? $this->resizeToHeight : $sourceImageHeight); } // prepares the target image $targetImageIdentifier = $this->create_target_image_identifier($targetImageWidth, $targetImageHeight); // resizes image imagecopyresized($targetImageIdentifier, $sourceImageIdentifier, 0, 0, 0, 0, $targetImageWidth, $targetImageHeight, $sourceImageWidth, $sourceImageHeight); // writes image return $this->output_target_image($targetImageIdentifier); } /** * Flips horizontally the image given as {@link sourceFile} and outputs the resulted image as {@link targetFile} * * @return boolean TRUE on success, FALSE on error. * If FALSE is returned, check the {@link error} property to see what went wrong */ function flip_horizontal() { // creates an image from sourceFile list($sourceImageIdentifier, $sourceImageWidth, $sourceImageHeight) = $this->create_image_from_source_file(); // prepares the target image $targetImageIdentifier = $this->create_target_image_identifier($sourceImageWidth, $sourceImageHeight); // flips image horizontally for ($x = 0; $x < $sourceImageWidth; $x++) { imagecopy($targetImageIdentifier, $sourceImageIdentifier, $x, 0, $sourceImageWidth - $x - 1, 0, 1, $sourceImageHeight); } // writes image return $this->output_target_image($targetImageIdentifier); } /** * Flips vertically the image given as {@link sourceFile} and outputs the resulted image as {@link targetFile} * * @return boolean TRUE on success, FALSE on error. * If FALSE is returned, check the {@link error} property to see what went wrong */ function flip_vertical() { // creates an image from sourceFile list($sourceImageIdentifier, $sourceImageWidth, $sourceImageHeight) = $this->create_image_from_source_file(); // prepares the target image $targetImageIdentifier = $this->create_target_image_identifier($sourceImageWidth, $sourceImageHeight); // flips image vertically for ($y = 0; $y < $sourceImageHeight; $y++) { imagecopy($targetImageIdentifier, $sourceImageIdentifier, 0, $y, 0, $sourceImageHeight - $y - 1, $sourceImageWidth, 1); } // writes image return $this->output_target_image($targetImageIdentifier); } /** * Rotates the image given as {@link sourceFile} and outputs the resulted image as {@link targetFile} * * this method implements PHP's imagerotate method which is buggy. * an improved version of this method should be available soon * * @param double $angle angle to rotate the image by * @param mixed $bgColor the color of the uncovered zone after the rotation * * @return boolean TRUE on success, FALSE on error. * If FALSE is returned, check the {@link error} property to see what went wrong */ function rotate($angle, $bgColor) { // creates an image from sourceFile list($sourceImageIdentifier, $sourceImageWidth, $sourceImageHeight) = $this->create_image_from_source_file(); // rotates image $targetImageIdentifier = imagerotate($sourceImageIdentifier, $angle, $bgColor); // writes image return $this->output_target_image($targetImageIdentifier); } } Quote Link to comment Share on other sites More sharing options...
Pioden Posted May 27, 2008 Author Share Posted May 27, 2008 Hi BlueSky, Interesting though the code you posted is it's nothing like the class I posted. ImageMagick is IMHO quite a bit better than GD at image manipulation. The class you posted is all about GD. Thanks though. The code is pretty interesting and may be of some use to me. Huw Quote Link to comment Share on other sites More sharing options...
BlueSkyIS Posted May 27, 2008 Share Posted May 27, 2008 very interesting, i didn't know. what do you prefer about ImageMagick over GD? here is imagemagick code i have used for thumbs: // Create thumbnail for faster loading $sizefactor = ($tn_width / $image_width) ; $image_width = $newwidth = ($image_width * $sizefactor); $image_height = $newheight = ($image_height * $sizefactor); $newsize = $newwidth . "x" . $newheight; $cmd_path = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11;"; $cmd = $cmd_path."convert -resize $newsize ". $product_image_location . "$local_file ". $product_image_location . "$tn_name 2>&1"; $exec_retval = exec($cmd, $exec_output, $exec_retval); if ($exec_retval > 0) { array_push($errors, "File convert failed: $cmd $newsize $product_image_location $local_file $tn_name."); } $product_image_location . $local_file is the un-thumbed image. $product_image_location . $tn_name is the thumb. Quote Link to comment Share on other sites More sharing options...
Pioden Posted May 27, 2008 Author Share Posted May 27, 2008 ImageMagick seems to do a really good job of resizing images - nice clean resizes with little degradation to the image. IM is also very quick about doing it. I know that GD is much better now than it used to be - but that's largely down to trying to catch up with IM. Huw Quote Link to comment Share on other sites More sharing options...
BlueSkyIS Posted May 27, 2008 Share Posted May 27, 2008 i've done both, not sure how i ended up there. as you see, i used convert -resize instead of convert -geometry as you have. maybe this will help, but i'm getting out of my element here. thanks for the info! Quote Link to comment Share on other sites More sharing options...
Pioden Posted May 27, 2008 Author Share Posted May 27, 2008 No problem. I just wish I could figure out why it doesn't work - it's a brilliant class in every other respect. Anyone got any bright ideas? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.