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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
PHP编程与应用
Oct 09 PHP
php5数字型字符串加解密代码
Apr 24 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
php跨域cookie共享使用方法
Feb 20 PHP
destoon找回管理员密码的方法
Jun 21 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
Mar 27 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利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
Vue.js图片预览插件使用详解
2018/08/27 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
仓管岗位职责范本
2014/02/08 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
教师教学评估方案
2014/05/09 职场文书
天地会口号
2014/06/17 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
千与千寻观后感
2015/06/04 职场文书