HTML5 canvas如何实现移动端上传头像拖拽裁剪效果

又是一场大雪过后,天空像海一样蔚蓝,甚至比海更加晶莹剔透。千峰万岭,极目望去,尽是白色,闪耀着一片连接不断的银光。山顶积雪未融,如白银宫网。

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

下图为裁剪后的效果:

html部分:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <htmllang="en">
  3. <head>
  4. <metacharset="UTF-8">
  5. <title>上传头像</title>
  6. <metaname="renderer"content="webkit">
  7. <metaname="viewport"content="width=device-width,initial-scale=1.0">
  8. </head>
  9. <body>
  10. <divid="imgCrop"style="width:200px;height:200px;border:1pxsolid#ccc;overflow:hidden;">
  11. <imgsrc="img/test.jpg"alt="">
  12. </div>
  13. <inputtype="file"accept="image/*"/>
  14. <buttonid="save">保存</button>
  15. <p>下面为剪切的图片:</p>
  16. <divid="imgShow"></div>
  17. </body>
  18. </html>

JavaScript部分:

JavaScript Code复制内容到剪贴板
  1. var$imgCrop=$("#imgCrop");
  2. var$img=$imgCrop.find("img");
  3. varimg=$img[0];
  4. varwidth=parseInt($imgCrop.css("width"));
  5. varheight=parseInt($imgCrop.css("height"));
  6. varstartX,startY,scale=1;
  7. varx=0,y=0;
  8. $("input").on("change",function(){
  9. varfr=newFileReader();
  10. varfile=this.files[0]
  11. //console.log(file);
  12. if(!/image\/\w+/.test(file.type)){
  13. alert(file.name+"不是图片文件!");
  14. return;
  15. }
  16. console.log(file);
  17. $img.removeAttr("heightwidth");
  18. fr.readAsDataURL(file);
  19. fr.onload=function(){
  20. img.src=fr.result;
  21. varwidthInit=img.width;
  22. if(img.width>img.height){
  23. img.height=height;
  24. x=(width-img.width)/2;
  25. y=0;
  26. }else{
  27. img.width=width;
  28. x=0;
  29. y=(height-img.height)/2;
  30. }
  31. scale=widthInit/img.width;
  32. move($img,x,y);
  33. };
  34. });
  35. img.addEventListener("touchstart",function(e){
  36. startX=e.targetTouches[0].pageX;
  37. startY=e.targetTouches[0].pageY;
  38. return;
  39. });
  40. img.addEventListener("touchmove",function(e){
  41. e.preventDefault();
  42. e.stopPropagation();
  43. varchangeX=e.changedTouches[0].pageX-startX+x;
  44. varchangeY=e.changedTouches[0].pageY-startY+y;
  45. move($(this),changeX,changeY);
  46. return;
  47. });
  48. img.addEventListener("touchend",function(e){
  49. varchangeX=e.changedTouches[0].pageX-startX+x;
  50. varchangeY=e.changedTouches[0].pageY-startY+y;
  51. x=x+e.changedTouches[0].pageX-startX;
  52. y=y+e.changedTouches[0].pageY-startY;
  53. move($(this),changeX,changeY);
  54. return;
  55. });
  56. //确定目标图片的样式
  57. functionmove(ele,x,y){
  58. ele.css({
  59. '-webkit-transform':'translate3d('+x+'px,'+y+'px,0)',
  60. 'transform':'translate3d('+x+'px,'+y+'px,0)'
  61. });
  62. }
  63. $("#save").on("click",function(){
  64. varurl=imageData($img);
  65. console.log(url);
  66. $("#imgShow").html("<imgsrc="+url+"/>");;
  67. });
  68. //裁剪图片
  69. functionimageData($img){
  70. varcanvas=document.createElement('canvas');
  71. varctx=canvas.getContext('2d');
  72. canvas.width=width;
  73. canvas.height=height;
  74. ctx.drawImage(img,-x*scale,-y*scale,width*scale,height*scale,0,0,width,height);
  75. returncanvas.toDataURL();
  76. }

以上就是本文的全部内容,希望对大家的学习有所帮助。

原文:http://www.cnblogs.com/yifengBlog/p/5265598.html

您可能有感兴趣的文章
HTML5之高度塌陷问题的如何解决

html5笛卡尔心形曲线的如何实现

如何使用feDisplacementMap+feImage滤镜如何实现水波纹效果(计算动态值)

如何使用canvas对video视频某一刻截图功能

Canvas如何做个雪花屏版404的如何实现