准备开发个头像上传及剪裁功能 想象的比较简单 没想到做起来这么费时间 – – 逻辑也要比我想象的多 下面简单说一下前后端的实现!
前端:主要是用JS 这里如果想偷懒的话推荐两个JQ jcrop和jscroll都很不错
前端主要是对图片进行定位 剪裁 长宽 和 横纵坐标的计算(这里有个问题 假如图片尺寸过大 要给一个max-width:600px;的属性)
后端:1、先接收剪裁图片的原图
2、将原图进行第一次处理 AJAX返回给前端 JS:前端加载 后端的图片 并且将图片动态给予剪裁指令相关function
3、将剪裁的参数 x y w h 及原图文件名 四个参数值传入到后端
4、后端处理
(1)在服务器内的原图 (2)前端的五个数据
根据数据读取服务器内原图 然后通过参数对图片进行剪裁 生成第二张图片
这里有个小细节需要注意:之前前端max-width:600px; 那我们后端在处理的时候 也要对大于600像素宽度的图进行等比剪裁处理
也就是 1、先将服务器内width>600px的图片 等比例 生成图片2
2、将图片2 他就是宽度600px
暂时就用PHP的封装方法了撒 使用的是GD库
//有头像 并且 把昵称字段追加进来
$picname=$_POST['avatarf']; //将POST的名字传进来
$image = new \Think\Image();
$imagesinfo=$image->open('images/user/avatar/temp/'.$picname);
$imgwidth=$imagesinfo->width();
$imgheight=$imagesinfo->height();
$p1=stripos($picname,'.'); //返回点的位置 分析图片名称
$picstart=substr($picname,0,$p1); //计算图片名
$picend=substr($picname,$p1); //计算图片后缀
if($imgwidth > 600){ //图像最大限度600px 大于600生成600px
$w1= 600; //前台max-width:600px
$h1= floor($imgheight*(600/$imgwidth)); //计算宽度600的等比例高度
$imgmax=$image->thumb($w1,$h1)->save('images/user/avatar/temp/'.$picstart.'_max600'.$picend);
$image->open('images/user/avatar/temp/'.$picstart.'_max600'.$picend);
}
//将图片裁剪为400x400并保存为corp.jpg
$avatarname=$uinfo['id'].mt_rand(1000,9999);
$image->crop($_POST['w'],$_POST['h'],$_POST['x'],$_POST['y'])->thumb(150,150)->save('images/user/avatar/'.$avatarname.$picend);
$config=array(
'name' => $name,
'avatar' => '/images/user/avatar/'.$avatarname.$picend
);
$res=$Musers->Mupdate($uinfo['id'],$config);
if($res){
$this->uinfoload(); //更新uinfo session
echo '{"state":1,"con":"头像修改成功"}';
}else{
echo '{"state":2,"con":"修改失败,错误3901"}';
}
将剪裁处理后的图片名存入到数据库