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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
JS 网站性能优化笔记
May 24 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 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/02 无线电
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
第十二节 类的自动加载 [12]
2006/10/09 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
python获得一个月有多少天的方法
2015/06/04 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
教师节活动总结
2014/08/29 职场文书
超市督导岗位职责
2015/04/10 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
庆元旦主持词
2015/07/06 职场文书
合作意向书怎么写
2019/06/24 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis
MySQL数据库表约束讲解
2022/06/21 MySQL