首页 >后端开发 >php教程 >php调整图片大小的image resize函数详解

php调整图片大小的image resize函数详解

黄舟
黄舟原创
2017-07-26 13:47:217597浏览

我用过一些php实现的图片大小调整(image resize)函数,但是都不是很完美,有的图片在调整之后完全变形,还有的无缘无故多了一些线条,有的在颜色亮度上也差强人意。今天我重新找了下,又有了一些收获。

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

用ImageMagick来实现

有人提到用ImageMagick来实现,它里面有很多选项,我们可以用很少的代码就能实现图片调整。值得研究下。

 $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();

用php_class_upload实现

如果如上介绍不适合你,你不单能图片上传和图片调整,还可以切、割、加水印、旋转、翻转等等。

其他实现代码参考

此代码可以返回图片以及正确的名称,但是只能是黑色的?

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

代码改善后,看看如下代码,可以设置颜色。

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

以上是php调整图片大小的image resize函数详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn