PHP图像调整大小,与Thumbnailer问题

时间:2013-12-20 16:10:32

标签: php image image-processing gd

图像调整大小功能出现问题。

功能

// 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;          
    }
}

用法

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

使用该比率调整图像大小现在可以使用上面更新的函数。我现在发现的问题是,如果原始宽度小于我想要指定的尺寸,则图像的大小调整(变大)。

我所追求的是经过调整大小的图像,它永远不会比$maxWidth更宽,永远不会高于$maxHeight,同时保持原始图像的宽高比。

2 个答案:

答案 0 :(得分:1)

你想要这个我想:

    $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;
    }

然后围绕你的imagecopyresized put:

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

答案 1 :(得分:0)

知道了。

    /* 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;          
    }