【问题标题】:Php img Resize before Crop裁剪前PHP图像调整大小
【发布时间】:2017-02-25 02:25:55
【问题描述】:

我希望将图像大小调整为 400 x 300 像素。如果图像的宽度大于 400 像素,我希望先调整其大小,然后再裁剪高度。

图像来自远程网站,因此可以是纵向的,也可以是横向的,但我想要实现的是尽可能减少裁剪量,并尽可能在裁剪前先调整大小。

我正在使用以下代码(老实说,我自己很困惑)。比率和数字不太好。代码来自几个 SO 答案代码。

function makeThumb($imgsrc, $imgtarg, $imgtarg_d) {



    $ext = exif_imagetype($imgsrc);

    if ($ext == false) {
        return;
    }

//getting the image dimensions
    list($width, $height) = getimagesize($imgsrc);

//saving the image into memory (for manipulation with GD Library)

    switch($ext) {
        case 1:
            $myImage = imagecreatefromgif($imgsrc);
            break;
        case 2:
            $myImage = imagecreatefromjpeg($imgsrc);
            break;
        case 3:
            $myImage = imagecreatefrompng($imgsrc);
            break;
    }


// calculating the part of the image to use for thumbnail
    if ($width > $height) {
        $y = 0;
        $x = ($width - $height) / 2;
        $smallestSide = $height;

        if ($width >= 400) {

            $thumbSizeWidth = 400;
            $thumbSizeHeight = 300;

        } else {

            $thumbSizeWidth = $width;
            $thumbSizeHeight = 300;
        }
    } else {
        $x = 0;
        $y = ($height - $width) / 2;
        $smallestSide = $width;

        if ($height >= 300) {
            $thumbSizeHeight = 300;
            $thumbSizeWidth = 400;
        } else {
            $thumbSizeHeight = $height;
            $thumbSizeWidth = 400;
        }


    }

    $thumb = imagecreatetruecolor($thumbSizeWidth, $thumbSizeHeight);

    /*RESIZE FIRST*/
    imagecopyresampled($thumb, $myImage, 0, 0, 0, $y, $thumbSizeWidth, $thumbSizeHeight, $width, $height);

    /*CROP*/
    imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSizeWidth, $thumbSizeHeight, $smallestSide, $smallestSide);

//final output

    imagejpeg($thumb, $imgtarg_d . '/' . $imgtarg,80);
    imagedestroy($thumb);

}

图像总是从中心裁剪(如预期的那样),但如果图像宽度超过 400 像素,它不会先调整大小。

imagecopyresampled($thumb, $myImage, 0, 0, 0, $y, $thumbSizeWidth, $thumbSizeHeight, $width, $height);
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSizeWidth, $thumbSizeHeight, $smallestSide, $smallestSide);

【问题讨论】:

    标签: php image gd


    【解决方案1】:

    试试这个

    //resize and crop image by center
    function resize_crop_image($max_width, $max_height, $source_file, $dst_dir, $quality = 80){
        $imgsize = getimagesize($source_file);
        $width = $imgsize[0];
        $height = $imgsize[1];
        $mime = $imgsize['mime'];
    
        switch($mime){
            case 'image/gif':
                $image_create = "imagecreatefromgif";
                $image = "imagegif";
                break;
    
            case 'image/png':
                $image_create = "imagecreatefrompng";
                $image = "imagepng";
                $quality = 7;
                break;
    
            case 'image/jpeg':
                $image_create = "imagecreatefromjpeg";
                $image = "imagejpeg";
                $quality = 80;
                break;
    
            default:
                return false;
                break;
        }
    
        $dst_img = imagecreatetruecolor($max_width, $max_height);
        $src_img = $image_create($source_file);
    
        $width_new = $height * $max_width / $max_height;
        $height_new = $width * $max_height / $max_width;
        //if the new width is greater than the actual width of the image, then the height is too large and the rest cut off, or vice versa
        if($width_new > $width){
            //cut point by height
            $h_point = (($height - $height_new) / 2);
            //copy image
            imagecopyresampled($dst_img, $src_img, 0, 0, 0, $h_point, $max_width, $max_height, $width, $height_new);
        }else{
            //cut point by width
            $w_point = (($width - $width_new) / 2);
            imagecopyresampled($dst_img, $src_img, 0, 0, $w_point, 0, $max_width, $max_height, $width_new, $height);
        }
    
        $image($dst_img, $dst_dir, $quality);
    
        if($dst_img)imagedestroy($dst_img);
        if($src_img)imagedestroy($src_img);
    }
    //usage example
    resize_crop_image(100, 100, "test.jpg", "test.jpg");
    

    source

    【讨论】:

    • 您的代码运行良好!但是我认为..你能告诉我在哪里编辑吗?如果宽度大于高度。我不想裁剪高度。
    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 2011-11-11
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多