Home  >  Article  >  Backend Development  >  Detailed explanation of image resize function in PHP to adjust image size

Detailed explanation of image resize function in PHP to adjust image size

黄舟
黄舟Original
2017-07-26 13:47:217556browse

I have used some image resize functions implemented in PHP, but they are not perfect. Some pictures are completely deformed after adjustment, and some have more lines for no reason, and some have poor color brightness. Not satisfactory either. Today I searched again and gained some more results.

if(isset($_FILES['manager_photo']) && !empty($_FILES['manager_photo']['name']))
    {
        $photo_name=$manager_name."-".$_FILES["manager_photo"]["name"];
        $tmpname = $_FILES['manager_photo']['tmp_name'];
        $file_ext= substr($photo_name, strripos($photo_name, '.'));   
        $dir = "./manager_photos/";
        // finally resize
        @img_resize( $tmpname , 90 ,  $dir , $photo_name, 1);
}
function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight = 0 )
    {
    $save_dir     .= ( substr($save_dir,-1) != "/") ? "/" : "";
    $gis        = getimagesize($tmpname);
    $type        = $gis[2];
    switch($type)
        {
        case "1": $imorig = imagecreatefromgif($tmpname); break;
        case "2": $imorig = imagecreatefromjpeg($tmpname);break;
        case "3": $imorig = imagecreatefrompng($tmpname); break;
        default:  $imorig = imagecreatefromjpeg($tmpname);
        }
        $x = imagesx($imorig);
        $y = imagesy($imorig);
        $woh = (!$maxisheight)? $gis[0] : $gis[1] ; 
        if($woh <= $size)
        {
        $aw = $x;
        $ah = $y;
        }
            else
        {
            if(!$maxisheight){
                $aw = $size;
                $ah = $size * $y / $x;
            } else {
                $aw = $size * $x / $y;
                $ah = $size;
            }
        }
        $im = imagecreatetruecolor($aw,$ah);
    if (imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y))
        if (imagejpeg($im, $save_dir.$save_name))
            return true;
            else
            return false;
}//img_resize

Use ImageMagick to implement it

Someone mentioned using ImageMagick to implement it. There are many options in it, and we can achieve image adjustment with very little code. Worth studying.

 $image = new Imagick($src);
 $image->resizeImage($width,$height,Imagick::FILTER_LANCZOS,1);
 $image->cropImage($width_2, $height_2, $x, $y);
 $image->setCompression(Imagick::COMPRESSION_JPEG);
 $image->setImageCompressionQuality(82);
 $image->writeImage($dest);
 $image->destroy();

Use php_class_upload to implement

If the above introduction is not suitable for you, you can not only upload and adjust images, but also cut, cut, add watermarks, rotate, flip, etc.

Other implementation code reference

This code can return the picture and the correct name, but can it only be black?

function resize($originalImage){
list($width, $height) = getimagesize($originalImage);
$newName=basename($originalImage);
$imageResized = imagecreatetruecolor(128, 128);
$imageTmp = imagecreatefromjpeg($originalImage);
imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, 128, 128, $width, $height);
imagejpeg($imageResized, "resizedImg/$newName",100);
imageDestroy($imageResized);
}

After the code is improved, look at the following code to set the color.

function resizeImage($file){
        define (&#39;MAX_WIDTH&#39;, 1500);//max image width              
        define (&#39;MAX_HEIGHT&#39;, 1500);//max image height
        define (&#39;MAX_FILE_SIZE&#39;, 10485760);
        //iamge save path
        $path = &#39;storeResize/&#39;; 
        //size of the resize image
        $new_width = 128;
        $new_height = 128;   
        //name of the new image          
        $nameOfFile = &#39;resize_&#39;.$new_width.&#39;x&#39;.$new_height.&#39;_&#39;.basename($file[&#39;name&#39;]);     
        $image_type = $file[&#39;type&#39;];
        $image_size = $file[&#39;size&#39;];
        $image_error = $file[&#39;error&#39;];
        $image_file = $file[&#39;tmp_name&#39;];
        $image_name = $file[&#39;name&#39;];       
        $image_info = getimagesize($image_file);
        //check image type
        if ($image_info[&#39;mime&#39;] == &#39;image/jpeg&#39; or $image_info[&#39;mime&#39;] == &#39;image/jpg&#39;){   
        }
        else if ($image_info[&#39;mime&#39;] == &#39;image/png&#39;){   
        }
        else if ($image_info[&#39;mime&#39;] == &#39;image/gif&#39;){   
        }
        else{           
            //set error invalid file type
        }
        if ($image_error){
            //set error image upload error
        }
        if ( $image_size > MAX_FILE_SIZE ){
            //set error image size invalid
        }
        switch ($image_info[&#39;mime&#39;]) {
            case &#39;image/jpg&#39;: //This isn&#39;t a valid mime type so we should probably remove it
            case &#39;image/jpeg&#39;:
            $image = imagecreatefromjpeg ($image_file);
            break;
            case &#39;image/png&#39;:
            $image = imagecreatefrompng ($image_file);
            break;
            case &#39;image/gif&#39;:
            $image = imagecreatefromgif ($image_file);
            break;
        }   
        if ($new_width == 0 && $new_height == 0) {
            $new_width = 100;
            $new_height = 100;
        }
        // ensure size limits can not be abused
        $new_width = min ($new_width, MAX_WIDTH);
        $new_height = min ($new_height, MAX_HEIGHT);
        //get original image h/w
        $width = imagesx ($image);
        $height = imagesy ($image);
        //$align = &#39;b&#39;;
        $zoom_crop = 1;
        $origin_x = 0;
        $origin_y = 0;
        //TODO setting Memory
        // generate new w/h if not provided
        if ($new_width && !$new_height) {
            $new_height = floor ($height * ($new_width / $width));
        } else if ($new_height && !$new_width) {
            $new_width = floor ($width * ($new_height / $height));
        }
        // scale down and add borders
        if ($zoom_crop == 3) {
         $final_height = $height * ($new_width / $width);
         if ($final_height > $new_height) {
            $new_width = $width * ($new_height / $height);
         } else {
            $new_height = $final_height;
         }
        }
        // create a new true color image
        $canvas = imagecreatetruecolor ($new_width, $new_height);
        imagealphablending ($canvas, false);
        if (strlen ($canvas_color) < 6) {
            $canvas_color = &#39;ffffff&#39;;      
        }
        $canvas_color_R = hexdec (substr ($canvas_color, 0, 2));
        $canvas_color_G = hexdec (substr ($canvas_color, 2, 2));
        $canvas_color_B = hexdec (substr ($canvas_color, 2, 2));
        // Create a new transparent color for image
        $color = imagecolorallocatealpha ($canvas, $canvas_color_R, $canvas_color_G,$canvas_color_B, 127);
        // Completely fill the background of the new image with allocated color.
        imagefill ($canvas, 0, 0, $color);
        // scale down and add borders
        if ($zoom_crop == 2) {
            $final_height = $height * ($new_width / $width);
          if ($final_height > $new_height) {
            $origin_x = $new_width / 2;
            $new_width = $width * ($new_height / $height);
            $origin_x = round ($origin_x - ($new_width / 2));
            } else {
            $origin_y = $new_height / 2;
            $new_height = $final_height;
            $origin_y = round ($origin_y - ($new_height / 2));
          }
        }
        // Restore transparency blending
        imagesavealpha ($canvas, true);
        if ($zoom_crop > 0) {
            $src_x = $src_y = 0;
            $src_w = $width;
            $src_h = $height;
            $cmp_x = $width / $new_width;
            $cmp_y = $height / $new_height;
            // calculate x or y coordinate and width or height of source
            if ($cmp_x > $cmp_y) {
        $src_w = round ($width / $cmp_x * $cmp_y);
        $src_x = round (($width - ($width / $cmp_x * $cmp_y)) / 2);
            } else if ($cmp_y > $cmp_x) {
        $src_h = round ($height / $cmp_y * $cmp_x);
        $src_y = round (($height - ($height / $cmp_y * $cmp_x)) / 2);
            }
            // positional cropping!
        if ($align) {
            if (strpos ($align, &#39;t&#39;) !== false) {
                $src_y = 0;
            }
                        if (strpos ($align, &#39;b&#39;) !== false) {
                                $src_y = $height - $src_h;
                        }
                        if (strpos ($align, &#39;l&#39;) !== false) {
                $src_x = 0;
            }
            if (strpos ($align, &#39;r&#39;) !== false) {
                $src_x = $width - $src_w;
            }
        }
            // positional cropping!
            imagecopyresampled ($canvas, $image, $origin_x, $origin_y, $src_x, $src_y, $new_width, $new_height, $src_w, $src_h);
         } else {      
        imagecopyresampled ($canvas, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    }
        //Straight from Wordpress core code. Reduces filesize by up to 70% for PNG&#39;s
        if ( (IMAGETYPE_PNG == $image_info[2] || IMAGETYPE_GIF == $image_info[2]) && function_exists(&#39;imageistruecolor&#39;) && !imageistruecolor( $image ) && imagecolortransparent( $image ) > 0 ){
            imagetruecolortopalette( $canvas, false, imagecolorstotal( $image ) );
    }
        $quality = 100;           
        $nameOfFile = &#39;resize_&#39;.$new_width.&#39;x&#39;.$new_height.&#39;_&#39;.basename($file[&#39;name&#39;]);      
    if (preg_match(&#39;/^image\/(?:jpg|jpeg)$/i&#39;, $image_info[&#39;mime&#39;])){                      
        imagejpeg($canvas, $path.$nameOfFile, $quality); 
    } else if (preg_match(&#39;/^image\/png$/i&#39;, $image_info[&#39;mime&#39;])){                        
        imagepng($canvas, $path.$nameOfFile, floor($quality * 0.09));
    } else if (preg_match(&#39;/^image\/gif$/i&#39;, $image_info[&#39;mime&#39;])){              
        imagegif($canvas, $path.$nameOfFile);
    }
}

The above is the detailed content of Detailed explanation of image resize function in PHP to adjust image size. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn