本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽然样式不好看,但是功能还算全:

下图为裁剪后的效果:

html部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传头像</title>
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="imgCrop" style="width:200px;height:200px;border:1px solid #ccc;overflow:hidden;">
<img src="img/test.jpg" alt="">
</div>
<input type="file" accept="image/*" />
<button id="save">保存</button>
<p>下面为剪切的图片:</p>
<div id="imgShow"></div>
</body>
</html>

JavaScript部分:

var $imgCrop = $("#imgCrop");
var $img = $imgCrop.find("img");
var img = $img[0];
var width = parseInt($imgCrop.css("width"));
var height = parseInt($imgCrop.css("height"));
var startX,startY,scale = 1;
var x = 0,y = 0;
$("input").on("change",function(){
var fr = new FileReader();
var file = this.files[0]
//console.log(file);
if(!/image\/\w+/.test(file.type)){
alert(file.name + "不是图片文件!");
return;
}
console.log(file);
$img.removeAttr("height width");
fr.readAsDataURL(file); fr.onload = function(){
img.src = fr.result;
var widthInit = img.width;
if(img.width>img.height){
img.height = height;
x = (width - img.width)/2;
y = 0;
}else{
img.width = width;
x = 0;
y = (height - img.height)/2;
}
scale = widthInit/img.width;
move($img, x, y); }; }); img.addEventListener("touchstart",function(e){
startX = e.targetTouches[0].pageX;
startY = e.targetTouches[0].pageY; return; });
img.addEventListener("touchmove",function(e){
e.preventDefault();
e.stopPropagation(); var changeX = e.changedTouches[0].pageX - startX + x;
var changeY = e.changedTouches[0].pageY - startY + y; move($(this), changeX, changeY);
return; });
img.addEventListener("touchend",function(e){
var changeX = e.changedTouches[0].pageX - startX + x;
var changeY = e.changedTouches[0].pageY - startY + y; x = x + e.changedTouches[0].pageX - startX;
y = y + e.changedTouches[0].pageY - startY; move($(this), changeX, changeY);
return; });
//确定目标图片的样式
function move(ele, x, y){
ele.css({
'-webkit-transform' : 'translate3d(' + x + 'px, ' + y + 'px, 0)',
'transform' : 'translate3d(' + x + 'px, ' + y + 'px, 0)'
});
} $("#save").on("click",function(){
var url = imageData($img);
console.log(url); $("#imgShow").html("<img src="+url+" />");;
});
//裁剪图片
function imageData($img) {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = width ;
canvas.height = height;
ctx.drawImage(img, -x*scale, -y*scale, width*scale, height*scale, 0, 0, width, height);
return canvas.toDataURL();
}

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局
  2. eaysui 利用datagrid 实现左右移除数据
  3. AKI
  4. ios UIView sizeToFit sizeThatFits
  5. vpn+路由表,最大限度提高上网速度
  6. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
  7. c#获得目标服务器中所有数据库名、表名、列名的实现代码
  8. hibernate 连接数据库时报错
  9. HTML标签&lt;b&gt;与&lt;strong&gt;以及&lt;i&gt;与&lt;em&gt;的区别
  10. jquery_ajax
  11. Qemu之Network Device全虚拟方案一:前端网络流的建立
  12. 一个简单易懂的javascrip selection&amp;range小案例
  13. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志
  14. MOSFET的半桥驱动电路设计要领详解
  15. python接口自动化测试(二)-requests.get()
  16. 【iCore1S 双核心板_FPGA】例程九:锁相环实验——锁相环的使用
  17. C# 视频多人脸识别的实现
  18. hdu-6333-莫队
  19. menson 使用方法
  20. 汇编 EAX,EBX,ECX,EDX,寄存器

热门文章

  1. IO调度算法
  2. c#接口容易被忽视的问题
  3. Patching Array
  4. jQuery插件编写规范
  5. C++ 里大写TRUE和小写true区别
  6. PPTP-VPN第一章——部署与简单使用
  7. Centos apache + mysql + usvn 配置svn 服务器
  8. sql查询当天,一周,一个月数据的语句
  9. 在使用dot。js中的值中有空格出现后,进行去除
  10. MongoDB数据导入导出成csv或者json