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 相关文章推荐
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
比较全面的PHP数组的使用方法小结
Sep 23 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
深入理解PHP中的global
Aug 19 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
php把字符串指定字符分割成数组的方法
Mar 12 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/04 无线电
PHP 各种排序算法实现代码
2009/08/20 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
php使用正则验证中文
2016/04/06 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python的另外几种语言实现
2015/01/29 Python
python中的lambda表达式用法详解
2016/06/22 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python学习基础之循环import及import过程
2018/04/22 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
英语教育专业自荐信
2014/05/29 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
思想道德自我评价2015
2015/03/09 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
论文致谢词范文
2015/05/14 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
庆祝教师节主持词
2015/07/06 职场文书
详解Python为什么不用设计模式
2021/06/24 Python
一文解答什么是MySQL的回表
2022/08/05 MySQL