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
Jun 29 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php ajax 静态分页过程形式
Sep 02 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 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中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
python中引用与复制用法实例分析
2015/06/04 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python面向对象封装操作案例详解
2019/12/31 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
社区安全检查制度
2014/02/03 职场文书
机修工工作职责
2014/02/21 职场文书
公证书标准格式
2014/04/10 职场文书
消费者投诉书范文
2015/07/02 职场文书
法制教育主题班会
2015/08/13 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫