php上传图片并压缩的实现方法

5年以前  |  阅读数:1048 次  |  编程语言:PHP 

本文实例讲解了php上传图片并压缩的实现方法,之前一篇《PHP实现图片上传并压缩》已经为大家进行了简单介绍,此次实现上传图片然后按照比例缩略图,指定缩略图的最大高度或者最大宽度,具体内容如下

实现代码:


    <?php 
    function _UPLOADPIC($upfile, $maxsize, $updir, $newname = 'date') { 

     if ($newname == 'date') 
     $newname = date ( "Ymdhis" ); //使用日期做文件名 
     $name = $upfile ["name"]; 
     $type = $upfile ["type"]; 
     $size = $upfile ["size"]; 
     $tmp_name = $upfile ["tmp_name"]; 

     switch ($type) { 
     case 'image/pjpeg' : 
     case 'image/jpeg' : 
      $extend = ".jpg"; 
      break; 
     case 'image/gif' : 
      $extend = ".gif"; 
      break; 
     case 'image/png' : 
      $extend = ".png"; 
      break; 
     } 
     if (emptyempty ( $extend )) { 
     echo ( "警告!只能上传图片类型:GIF JPG PNG" ); 
     exit (); 
     } 
     if ($size > $maxsize) { 
     $maxpr = $maxsize / 1000; 
     echo ( "警告!上传图片大小不能超过" . $maxpr . "K!" ); 
     exit (); 
     } 
     if (move_uploaded_file ( $tmp_name, $updir . $newname . $extend )) { 
     return $updir . $newname . $extend; 
     } 
    } 

    function show_pic_scal($width, $height, $picpath) { 
     $imginfo = GetImageSize ( $picpath ); 
     $imgw = $imginfo [0]; 
     $imgh = $imginfo [1]; 

     $ra = number_format ( ($imgw / $imgh), 1 ); //宽高比 
     $ra2 = number_format ( ($imgh / $imgw), 1 ); //高宽比 


     if ($imgw > $width or $imgh > $height) { 
     if ($imgw > $imgh) { 
      $newWidth = $width; 
      $newHeight = round ( $newWidth / $ra ); 

     } elseif ($imgw < $imgh) { 
      $newHeight = $height; 
      $newWidth = round ( $newHeight / $ra2 ); 
     } else { 
      $newWidth = $width; 
      $newHeight = round ( $newWidth / $ra ); 
     } 
     } else { 
     $newHeight = $imgh; 
     $newWidth = $imgw; 
     } 
     $newsize [0] = $newWidth; 
     $newsize [1] = $newHeight; 

     return $newsize; 
    } 



    function getImageInfo($src) 
    { 
     return getimagesize($src); 
    } 
    /** 
    * 创建图片,返回资源类型 
    * @param string $src 图片路径 
    * @return resource $im 返回资源类型 
    * **/ 
    function create($src) 
    { 
     $info=getImageInfo($src); 
     switch ($info[2]) 
     { 
     case 1: 
      $im=imagecreatefromgif($src); 
      break; 
     case 2: 
      $im=imagecreatefromjpeg($src); 
      break; 
     case 3: 
      $im=imagecreatefrompng($src); 
      break; 
     } 
     return $im; 
    } 
    /** 
    * 缩略图主函数 
    * @param string $src 图片路径 
    * @param int $w 缩略图宽度 
    * @param int $h 缩略图高度 
    * @return mixed 返回缩略图路径 
    * **/ 

    function resize($src,$w,$h) 
    { 
     $temp=pathinfo($src); 
     $name=$temp["basename"];//文件名 
     $dir=$temp["dirname"];//文件所在的文件夹 
     $extension=$temp["extension"];//文件扩展名 
     $savepath="{$dir}/{$name}";//缩略图保存路径,新的文件名为*.thumb.jpg 

     //获取图片的基本信息 
     $info=getImageInfo($src); 
     $width=$info[0];//获取图片宽度 
     $height=$info[1];//获取图片高度 
     $per1=round($width/$height,2);//计算原图长宽比 
     $per2=round($w/$h,2);//计算缩略图长宽比 

     //计算缩放比例 
     if($per1>$per2||$per1==$per2) 
     { 
     //原图长宽比大于或者等于缩略图长宽比,则按照宽度优先 
     $per=$w/$width; 
     } 
     if($per1<$per2) 
     { 
     //原图长宽比小于缩略图长宽比,则按照高度优先 
     $per=$h/$height; 
     } 
     $temp_w=intval($width*$per);//计算原图缩放后的宽度 
     $temp_h=intval($height*$per);//计算原图缩放后的高度 
     $temp_img=imagecreatetruecolor($temp_w,$temp_h);//创建画布 
     $im=create($src); 
     imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height); 
     if($per1>$per2) 
     { 
     imagejpeg($temp_img,$savepath, 100); 
     imagedestroy($im); 
     return addBg($savepath,$w,$h,"w"); 
     //宽度优先,在缩放之后高度不足的情况下补上背景 
     } 
     if($per1==$per2) 
     { 
     imagejpeg($temp_img,$savepath, 100); 
     imagedestroy($im); 
     return $savepath; 
     //等比缩放 
     } 
     if($per1<$per2) 
     { 
     imagejpeg($temp_img,$savepath, 100); 
     imagedestroy($im); 
     return addBg($savepath,$w,$h,"h"); 
     //高度优先,在缩放之后宽度不足的情况下补上背景 
     } 
    } 
    /** 
    * 添加背景 
    * @param string $src 图片路径 
    * @param int $w 背景图像宽度 
    * @param int $h 背景图像高度 
    * @param String $first 决定图像最终位置的,w 宽度优先 h 高度优先 wh:等比 
    * @return 返回加上背景的图片 
    * **/ 
    function addBg($src,$w,$h,$fisrt="w") 
    { 
     $bg=imagecreatetruecolor($w,$h); 
     $white = imagecolorallocate($bg,255,255,255); 
     imagefill($bg,0,0,$white);//填充背景 

     //获取目标图片信息 
     $info=getImageInfo($src); 
     $width=$info[0];//目标图片宽度 
     $height=$info[1];//目标图片高度 
     $img=create($src); 
     if($fisrt=="wh") 
     { 
     //等比缩放 
     return $src; 
     } 
     else 
     { 
     if($fisrt=="w") 
     { 
      $x=0; 
      $y=($h-$height)/2;//垂直居中 
     } 
     if($fisrt=="h") 
     { 
      $x=($w-$width)/2;//水平居中 
      $y=0; 
     } 
     imagecopymerge($bg,$img,$x,$y,0,0,$width,$height,100); 
     imagejpeg($bg,$src,100); 
     imagedestroy($bg); 
     imagedestroy($img); 
     return $src; 
     } 

    } 


    ?>

使用方法:


    $filename=(_UPLOADPIC($_FILES["upload"],$maxsize,$updir,$newname='date')); 
     $show_pic_scal=show_pic_scal(230, 230, $filename); 
     resize($filename,$show_pic_scal[0],$show_pic_scal[1]); 

希望本文所述对大家学习php程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例