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 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
php URL编码解码函数代码
Mar 10 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
PHP可变函数学习小结
Nov 29 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
值得分享的php+ajax实时聊天室
Jul 20 PHP
php微信开发之百度天气预报
Nov 18 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
使用laravel的migrate创建数据表的方法
Sep 30 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
js星星评分效果
2014/07/24 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python书籍信息爬虫实例
2018/03/19 Python
python自动发送邮件脚本
2018/06/20 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
荷兰电脑专场:Paradigit
2018/05/05 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
yy结婚证婚词
2014/01/10 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
求职信名称怎么写
2014/05/26 职场文书
承诺书样本
2014/08/30 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
小学新课改心得体会
2016/01/22 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python