简体   繁体   中英

PHP Image Resize, with Thumbnailer Issue

Having an issue with a image resize function.

Function

// Image Resizer
function MakeThumbnail($inputFile, $filepath, $ext, $maxWidth, $maxHeight){
    /* Get some details about the image */
    $srcDetails = getimagesize($inputFile);
    switch ($srcDetails[2]) {
        case 1: //GIF
            $source_image = imagecreatefromgif($inputFile);
            break;          
        case 2: //JPEG
            $source_image = imagecreatefromjpeg($inputFile);
            break;          
        case 3: //PNG
            $source_image = imagecreatefrompng($inputFile);
            break;          
        case 6: //WBMP
            $source_image = imagecreatefromwbmp($inputFile);
            break;          
        default:
            break;
    }       
    /* Original Dimensions */
    $width = imagesx($source_image);
    $height = imagesy($source_image);       
    /* find the "desired height" of this thumbnail, relative to the desired width, and vice-versa */
    if(($maxWidth <= $width) && $maxHeight <= $height){
        if($target_ratio == $original_ratio){
            $desired_height = $maxHeight;
            $desired_width = $maxWidth;
        }elseif($target_ratio > $original_ratio){
            $desired_height = $maxHeight;
            $desired_width = $width * ($maxHeight / $height);
        }elseif($target_ratio < $original_ratio){
            $desired_height = $height * ($maxWidth / $width);
            $desired_width = $maxWidth;
        }
    }else{
        $desired_height = $maxHeight;
        $desired_width = $maxWidth;
    }
imagecopyresized($virtual_image,$source_image,0,0,0,0,$maxWidth,$desired_height,$width,$height);        
    /* create the physical thumbnail image to its destination */
    switch ($srcDetails[2]) {
        case 1: //GIF
            imagegif($virtual_image, $filepath);
            imagedestroy($virtual_image);
            break;          
        case 2: //JPEG
            imagejpeg($virtual_image, $filepath, 100);
            imagedestroy($virtual_image);
            break;          
        case 3: //PNG
            imagepng($virtual_image, $filepath, 6);
            imagedestroy($virtual_image);
            break;          
        case 6: //WBMP
            imagewbmp($virtual_image, $filepath);
            imagedestroy($virtual_image);
            break;          
        default:
            imagedestroy($virtual_image);
            break;          
    }
}

Usage

MakeThumbnail($pic2['tmp_name'], $pic2Path, $extension, 800, 600); //<- resize original
MakeThumbnail($pic2['tmp_name'], $pic2ThumbPath, $extension, 150, 100); //<- make a thumbnail

Image resizing with the ratio now works with the updated function above. Issue I am finding now, is that the image(s) are resized up (made bigger), if the original width is smaller that what I am trying to specify.

What I am after is a resized image that will never be wider than $maxWidth , never be taller than $maxHeight , yet keep the width to height ratio of the original image.

You want this I think:

    $width = imagesx($source_image);
    $height = imagesy($source_image);     
    // new code to check if image is too small   
    if ($width <= $maxWidth || height <= $maxHeight) { //because we need to check either, and not both
     // image is too small; don't resize
        $doResize = false;
    } else {
        $doResize = true;
    }

Then around your imagecopyresized put:

if ($doResize) {
     imagecopyresized($virtual_image,$source_image,0,0,0,0,$maxWidth,$desired_height,$width,$height);        
}

Got it.

    /* Get some details about the image */
    $srcDetails = getimagesize($inputFile);
    switch ($srcDetails[2]) {
        case 1: //GIF
            $source_image = imagecreatefromgif($inputFile);
            break;          
        case 2: //JPEG
            $source_image = imagecreatefromjpeg($inputFile);
            break;          
        case 3: //PNG
            $source_image = imagecreatefrompng($inputFile);
            break;          
        case 6: //WBMP
            $source_image = imagecreatefromwbmp($inputFile);
            break;          
        default:
            break;
    }       
    /* Original Dimensions */
    $width = imagesx($source_image);
    $height = imagesy($source_image);   
    $target_ratio = $maxWidth / $maxHeight;
    $original_ratio = $width / $height; 
    /* find the "desired height" of this thumbnail, relative to the desired width, and vice-versa */
    if(($maxWidth <= $width) || $maxHeight <= $height){ // <-- needed to change this to orelse
        if($target_ratio == $original_ratio){
            $desired_height = $maxHeight;
            $desired_width = $maxWidth;
        }elseif($target_ratio > $original_ratio){
            $desired_height = $maxHeight;
            $desired_width = $width * ($maxHeight / $height);
        }elseif($target_ratio < $original_ratio){
            $desired_height = $height * ($maxWidth / $width);
            $desired_width = $maxWidth;
        }
    }else{
        $desired_height = $maxHeight;
        $desired_width = $maxWidth;
    }
    $virtual_image = imagecreatetruecolor($desired_width, $desired_height);     
    imagecopyresized($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);      
    /* create the physical thumbnail image to its destination */
    switch ($srcDetails[2]) {
        case 1: //GIF
            imagegif($virtual_image, $filepath);
            imagedestroy($virtual_image);
            break;          
        case 2: //JPEG
            imagejpeg($virtual_image, $filepath, 100);
            imagedestroy($virtual_image);
            break;          
        case 3: //PNG
            imagepng($virtual_image, $filepath, 6);
            imagedestroy($virtual_image);
            break;          
        case 6: //WBMP
            imagewbmp($virtual_image, $filepath);
            imagedestroy($virtual_image);
            break;          
        default:
            imagedestroy($virtual_image);
            break;          
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM