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 中英文语言转换类代码
Aug 11 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
php jq jquery getJSON跨域提交数据完整版
Sep 13 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
php中的登陆login实例代码
Jun 20 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 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
其他功能
2006/10/09 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
详解Python中heapq模块的用法
2016/06/28 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
Python面向对象程序设计示例小结
2019/01/30 Python
python 元组和列表的区别
2020/12/30 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
公积金接收函格式
2015/01/30 职场文书
房屋产权证明书
2015/06/19 职场文书