php裁剪图片(支持定点裁剪)

php裁剪图片(支持定点裁剪)

/** * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式 * @param <string> $src_file 原图片路径 * @param <int> $new_width 裁剪后图片宽度(当宽度超过原图片宽度时,去原图片宽度) * @param <int> $new_height 裁剪后图片高度(当宽度超过原图片宽度时,去原图片高度) * @param <int> $type 裁剪方式,1-方位模式裁剪;0-定点模式裁剪。 * @param <int> $pos 方位模式裁剪时的起始方位(当选定点模式裁剪时,此参数不起作用) * 1为顶端居左,2为顶端居中,3为顶端居右; * 4为中部居左,5为中部居中,6为中部居右; * 7为底端居左,8为底端居中,9为底端居右; * @param <int> $start_x 起始位置X (当选定方位模式裁剪时,此参数不起作用) * @param <int> $start_y 起始位置Y(当选定方位模式裁剪时,此参数不起作用) * @return <string> 裁剪图片存储路径 */ function thumb($src_file, $new_width, $new_height, $type = 1, $pos = 5, $start_x = 0, $start_y = 0) { $pathinfo = pathinfo($src_file); $dst_file = $pathinfo['dirname'] . '/' . $pathinfo['filename'] .'_'. $new_width . 'x' . $new_height . '.' . $pathinfo['extension']; if (!file_exists($dst_file)) { if ($new_width < 1 || $new_height < 1) { echo "params width or height error !"; return ; //exit();  } if (!file_exists($src_file)) { echo $src_file . " is not exists !"; return ; // exit();  } $img_type=pathinfo($src_file, PATHINFO_EXTENSION); $img_type=strtolower($img_type); /* 载入图像 */ switch ($img_type) { case 'jpg': if(@!($src_img= imagecreatefromjpeg($src_file))){ if(@!($src_img = imagecreatefrompng($src_file))){ $src_img = imagecreatefromgif($src_file); } } break; case 'png': if(@!($src_img= imagecreatefrompng($src_file))){ if(@!($src_img = imagecreatefromjpeg($src_file))){ $src_img = imagecreatefromgif($src_file); } } break; case 'gif': if(@!($src_img= imagecreatefromgif($src_file))){ if(@!($src_img = imagecreatefrompng($src_file))){ $src_img = imagecreatefromjpeg($src_file); } } break; default: echo "载入图像错误!"; return ; //exit();  } /* 获取源图片的宽度和高度 */ $src_width = imagesx($src_img); $src_height = imagesy($src_img); /* 计算剪切图片的宽度和高度 */ $mid_width = ($src_width < $new_width) ? $src_width : $new_width; $mid_height = ($src_height < $new_height) ? $src_height : $new_height; /* 初始化源图片剪切裁剪的起始位置坐标 */ switch ($pos * $type) { case 1://1为顶端居左 $start_x = 0; $start_y = 0; break; case 2://2为顶端居中 $start_x = ($src_width - $mid_width) / 2; $start_y = 0; break; case 3://3为顶端居右 $start_x = $src_width - $mid_width; $start_y = 0; break; case 4://4为中部居左 $start_x = 0; $start_y = ($src_height - $mid_height) / 2; break; case 5://5为中部居中 $start_x = ($src_width - $mid_width) / 2; $start_y = ($src_height - $mid_height) / 2; break; case 6://6为中部居右 $start_x = $src_width - $mid_width; $start_y = ($src_height - $mid_height) / 2; break; case 7://7为底端居左 $start_x = 0; $start_y = $src_height - $mid_height; break; case 8://8为底端居中 $start_x = ($src_width - $mid_width) / 2; $start_y = $src_height - $mid_height; break; case 9://9为底端居右 $start_x = $src_width - $mid_width; $start_y = $src_height - $mid_height; break; default://随机 break; } // 为剪切图像创建背景画板 $mid_img = imagecreatetruecolor($mid_width, $mid_height); //拷贝剪切的图像数据到画板,生成剪切图像 imagecopy($mid_img, $src_img, 0, 0, $start_x, $start_y, $mid_width, $mid_height); // 为裁剪图像创建背景画板 $new_img = imagecreatetruecolor($new_width, $new_height); //拷贝剪切图像到背景画板,并按比例裁剪 imagecopyresampled($new_img, $mid_img, 0, 0, 0, 0, $new_width, $new_height, $mid_width, $mid_height); /* 按格式保存为图片 */ switch ($img_type) { case 'jpg': imagejpeg($new_img, $src_file, 100); break; case 'png': imagepng($new_img, $src_file, 9); break; case 'gif': imagegif($new_img, $src_file, 100); break; default: break; } } return ltrim($src_file, '.'); }

https://www.cnblogs.com/zhaizhendong/p/6742147.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112614.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Apache配置虚拟主机

    Apache配置虚拟主机

  • matlab中interp1什么意思,matlab中interp1函数是什么意思啊?

    matlab中interp1什么意思,matlab中interp1函数是什么意思啊?csape可以选择样条的边界条件,interp1无法使用边界条件;csape只是Cubicspline插值,interp1可以选择几种不同的插值方法。csape函数的用法如下:pp=csape(x,y,conds,valconds)其中(x,y)为数据向量,conds表示变界类型,valconds表示边界值。边界类型(conds)可为:’complete’,给定边界一阶导数.’not-a-…

  • String与StringBuffer的区别

    String与StringBuffer的区别String与StringBuffer的区别简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。String:在String类中没有用来改变已有字

  • python中如何把列表转换为字符串

    python中如何把列表转换为字符串python中把列表转换为字符串1、join方法2、for语句1、join方法lis=[‘1′,’2′,’3′,’4′,’5’]s=””.join(lis)print(s)>>>’12345’语法格式为:str.join(sequence)sequence是序列类型,序列类型有列表、元组、range如果列表中为int型,可使用map(,)lis=[1,2,3,4,5]s=””.join(map(str,lis))print(s)&

  • cefsharp文档在哪_hdfs创建目录

    cefsharp文档在哪_hdfs创建目录参考:https://github.com/cefsharp/CefSharp/issues/601https://gist.github.com/BlackBooth/19ce027c4f68c1eb4fc1144988ca6662关键点:(1)设置CefSettings的BrowserSubprocessPath属性为对应的CefSharp.BrowserSubprocess.exe的…

  • 惠普笔记本拆机详细步骤

    惠普笔记本拆机详细步骤第一次拆电脑,拆着玩玩,非也,拆机原因一:本人笔记本两个小喇叭,结果一个正常声,一个破音了,不管把声音调大还是调小,这破音的效果依然不减,把声音出孔堵住听着舒服点…..拆机原因二:发热特别严重,编

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号