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
php裁剪图片(支持定点裁剪)的更多相关文章
- Java+jquery实现裁剪图片上传到服务器
大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...
- iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果
一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...
- jquery photoClip支持手机端,PC端 本地裁剪图片后上传插件
支持手机,PC最好的是jquery photoClip插件,下载地址&示例:https://github.com/topoadmin/photoClip demo.html 代码: <! ...
- 支持移动端裁剪图片插件Jcrop(结合WebUploader上传)
(此教程包括前端实现图片裁剪,后端进行获取裁剪区并保存) 最近有一个需求,微信公众号上传图片,支持自定义裁剪. 以前用过一款裁剪插件cropper,很久没用了,不知道对移动端操作兼容如何,重新从网上搜 ...
- HTML5 本地裁剪图片并上传至服务器(转)
很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...
- OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据
OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...
- Vue中使用Cropper.js裁剪图片
Cropper.js是一款很好用的图片裁剪工具,可以对图片的尺寸.宽高比进行裁剪,满足诸如裁剪头像上传.商品图片编辑之类的需求. github: https://github.com/fengyuan ...
- jquery.cropper 裁剪图片上传
https://github.com/fengyuanchen/cropper 1.必要的文件引用: <script src="/path/to/jquery.js"> ...
- 微信小程序裁剪图片成圆形
代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...
随机推荐
- Wake-Sleep(W-S)算法【转载】
原文: https://www.zhihu.com/question/29648549 https://blog.csdn.net/zouxy09/article/details/8775518 en ...
- golang 多维哈希(map,hashmap)实践随笔
有些场景使用多维哈希来存储数据,时间复杂度恒定,简单粗暴好用.这里记录一下. 如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识. 下图是三维哈希在内存的存储形式,has ...
- LeetCode二叉树实现
LeetCode二叉树实现 # 定义二叉树 class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
- linux 网络编程 3---(io多路复用,tcp并发)
1,io模型: 阻塞io.非阻塞io.io多路复用,信号驱动io. 阻塞Io与非阻塞io的转换,可用fcntl()函数 #include<unistd.h> #include<fcn ...
- css dropdown menu
<ul> <li class="left">abc</li> <li class="middle" id=" ...
- HTML基础part2
表单标签form 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.sel ...
- rsync同步的艺术
转自:http://roclinux.cn/?p=2643 如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能. 说到“同步”, ...
- Python中安装Prophet
1. 先安装pystan依赖 按照https://pystan.readthedocs.io/en/latest/windows.html说明,请使用如下命令 conda install libpyt ...
- apache Subversion 直接支持LDAP域群组
如果你的Subversion已经用apache的ldap支持用户认证功能,你是否常常在想,既然都用ldap支持认证,为什么不直接支持域群组, 反而在authz文件里面一个一个的手工定义,或者有人用脚本 ...
- hdu2899Strange fuction(解方程+二分)
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...