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 相关文章推荐
学习使用curl采集curl使用方法
Jan 11 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP json格式和js json格式 js跨域调用实现代码
Sep 08 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
PHP文件缓存类实现代码
Oct 26 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 PHP
零基础php编程好学吗
Oct 11 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
DSP接收机前端设想
2021/03/02 无线电
如何使用Strace调试工具
2013/06/03 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
python 解析html之BeautifulSoup
2009/07/07 Python
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
django项目搭建与Session使用详解
2018/10/10 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
毕业生优秀推荐信
2013/11/26 职场文书
经典促销广告词大全
2014/03/19 职场文书
优秀员工事迹材料
2014/12/20 职场文书
运动会表扬稿范文
2015/05/05 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
《鲸》教学反思
2016/02/23 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
德劲DE1105机评
2022/04/05 无线电
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server