PHP图片裁剪函数(保持图像不变形)


Posted in PHP onMay 04, 2014

为了完成图片上传之后自动的裁剪,然后在前台显示出裁剪出的图片。
需求如上,源码如下:

<?
 *exif_imagetype -- 判断一个图像的类型
 *说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形
 * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
 */
 // 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白
         function my_image_resize($src_file, $dst_file , $new_width , $new_height) {
        $new_width= intval($new_width);
        $new_height=intval($new_width);
         if($new_width <1 || $new_height <1) {
         echo "params width or height error !";
         exit();
         }
         if(!file_exists($src_file)) {
         echo $src_file . " is not exists !";
         exit();
         }
         // 图像类型
         $type=exif_imagetype($src_file);
         $support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
         if(!in_array($type, $support_type,true)) {
         echo "this type of image does not support! only support jpg , gif or png";
         exit();
         }
         //Load image
         switch($type) {
         case IMAGETYPE_JPEG :
         $src_img=imagecreatefromjpeg($src_file);
         break;
         case IMAGETYPE_PNG :
         $src_img=imagecreatefrompng($src_file);
         break;
         case IMAGETYPE_GIF :
         $src_img=imagecreatefromgif($src_file);
         break;
         default:
         echo "Load image error!";
         exit();
         }
         $w=imagesx($src_img);
         $h=imagesy($src_img);
         $ratio_w=1.0 * $new_width / $w;
         $ratio_h=1.0 * $new_height / $h;
         $ratio=1.0;
         // 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
         if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
         if($ratio_w < $ratio_h) {
         $ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
         }else {
         $ratio = $ratio_w ;
         }
         // 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
         $inter_w=(int)($new_width / $ratio);
         $inter_h=(int) ($new_height / $ratio);
         $inter_img=imagecreatetruecolor($inter_w , $inter_h);
         //var_dump($inter_img);
         imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
         // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
         // 定义一个新的图像
         $new_img=imagecreatetruecolor($new_width,$new_height);
         //var_dump($new_img);exit();
         imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
         switch($type) {
         case IMAGETYPE_JPEG :
         imagejpeg($new_img, $dst_file,100); // 存储图像
         break;
         case IMAGETYPE_PNG :
         imagepng($new_img,$dst_file,100);
         break;
         case IMAGETYPE_GIF :
         imagegif($new_img,$dst_file,100);
         break;
         default:
         break;
         }
         } // end if 1
         // 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
         // =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
         else{
         $ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
         // 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
         $inter_w=(int)($w * $ratio);
         $inter_h=(int) ($h * $ratio);
         $inter_img=imagecreatetruecolor($inter_w , $inter_h);
         //将原图缩放比例后裁剪
         imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
         // 定义一个新的图像
         $new_img=imagecreatetruecolor($new_width,$new_height);
         imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
         switch($type) {
         case IMAGETYPE_JPEG :
         imagejpeg($new_img, $dst_file,100); // 存储图像
         break;
         case IMAGETYPE_PNG :
         imagepng($new_img,$dst_file,100);
         break;
         case IMAGETYPE_GIF :
         imagegif($new_img,$dst_file,100);
         break;
         default:
         break;
         }
         }// if3
         }// end function
        my_image_resize('test.gif','11111.gif','100px','100px');
?>
PHP 相关文章推荐
PHP计划任务之关闭浏览器后仍然继续执行的函数
Jul 22 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
PHP整合PayPal支付
Jun 11 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 #PHP
PHP按行读取文件时删除换行符的3种方法
May 04 #PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 #PHP
PHP CURL获取返回值的方法
May 04 #PHP
PHP判断远程图片是否存在的几种方法
May 04 #PHP
一个PHP的ZIP压缩类分享
May 04 #PHP
PHP生成自定义长度随机字符串的函数分享
May 04 #PHP
You might like
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
javascript每日必学之多态
2016/02/23 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
Python单例模式实例详解
2017/03/01 Python
Python探索之ModelForm代码详解
2017/10/26 Python
python中update的基本使用方法详解
2019/07/17 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
会计电算化专业自荐信
2014/03/15 职场文书
梅花魂教学反思
2014/04/25 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
婚宴主持词
2015/06/30 职场文书
新闻通讯稿模板
2015/07/22 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL