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


Posted in PHP onDecember 22, 2015

本文实例讲解了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 相关文章推荐
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
php调用自己java程序的方法详解
May 13 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
PHP实现图片上传并压缩
Dec 22 #PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 #PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 #PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 #PHP
反射调用private方法实践(php、java)
Dec 21 #PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 #PHP
变量在 PHP7 内部的实现(二)
Dec 21 #PHP
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
在Python中使用next()方法操作文件的教程
2015/05/24 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
浅谈五大Python Web框架
2017/03/20 Python
django使用html模板减少代码代码解析
2017/12/12 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python爬取微博评论的实例讲解
2021/01/15 Python
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
Collection和Collections的区别
2016/05/02 面试题
高中毕业生自我鉴定
2013/11/03 职场文书
社会实践心得体会
2014/01/03 职场文书
公司授权委托书范本
2014/04/03 职场文书
团委竞选演讲稿
2014/04/24 职场文书
2015年司法局工作总结
2015/05/22 职场文书