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 相关文章推荐
实用函数3
Nov 08 PHP
一个PHP分页类的代码
May 18 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
php 中的4种标记风格介绍
May 10 PHP
php代码书写习惯优化小结
Jun 20 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
PHP实现的json类实例
Jul 28 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
php实现简单加入购物车功能
Mar 07 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
php判断IP地址是否在多个IP段内
Aug 18 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 上传功能实例代码
2010/04/13 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
jQuery Validate验证框架经典大全
2015/09/23 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
Python脚本实现虾米网签到功能
2016/04/12 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
十佳教师事迹材料
2014/01/11 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
个人简历自我评价
2014/02/02 职场文书
消防安全员岗位职责
2014/03/10 职场文书
企业诚信承诺书
2014/05/23 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript