上传裁剪头像(Jcrop)

-- by Stephen

2016/1/24 20:17:21

总体思路:用户点击选择头像按钮,选好图片后jcrop所在的div以遮罩层的形式显示,此时异步更新图片的src,即已经在服务器中将该图片保存了。返回给js图片的绝对路径和图片名称。用户点击保存头像按钮,向服务器传递图片名称和裁剪系数,异步回调得到裁剪结果,更新页面。

第一步:引入 jcrop 的 js 和 css 文件

这里使用了集成好的 basic.js 和 basic.css 和 html,代码可以去 github 上下载(下载地址:https://github.com/Stephen-LG/JcropDemo.git)

第二步:解决 input file 样式不好看的问题

将input file控件的display属性设成none,用另一个input button控件来间接控制input file控件(οnclick=”head_img.click()”,其中head_img为input file的id)。这样将input button控件设置成想要的样式即可

第三步:解决用户上传图片后异步更新jcrop插件中的图片src

这肯定需要ajax异步请求才能完成,我使用ajaxFileUpload插件来完成这个功能。但是因为这个插件很早就不再更新了,在使用过程中需要注意几点:

1. 在使用时会提示handleError不是一个function,我们在ajaxfileupload.js文件中添加如下代码:

handleError: function( s, xhr, status, e ) {

// If a local callback was specified, fire it

if ( s.error ) {

s.error.call( s.context || s, xhr, status, e );

}

// Fire the global callback

if ( s.global ) {

(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );

}

}

在服务器返回数据后,该插件会自动在数据外面包裹上pre标签,因为它使用eval函数,解决方式如下:

在uploadHttpData函数中的

if ( type == "json" )

eval( "data = " + data );

改成

if ( type == "json" )

data = jQuery.parseJSON(jQuery(data).text());

在回调函数中更新img的src后,插件获取到新图片的长宽一直是上一个。原因应该是在于,动态更改src以后,图片还没有下载完成,这个时候图片还没有被替换。解决方式如下:

$("#img").on("load",function(){

//这里添加你的函数就OK

});

用onchage函数监听input file控件只会触发一次。解决方式如下:

$(document).delegate('input[name=head_img]', 'change', function() {});

在选择过一次图片后在选择一次,这时img标签的width和height不会改变,而是图片拉伸了,解决方式如下:

将img标签移除再重新创建即可:

$('#origi-img').remove();

$('.jcrop_w').append("");

第四步:解决Jcrop的裁剪框只在缩略过的图片内部进行移动和裁剪

这个问题想了不少时间,最后用了比较笨的方法,在用户选择了图片后,用一个函数计算出缩略后的图片宽高,在获取Jcrop实例后用$(‘.jcrop-holder’).css({left:holderW,top:holderH});

第五步:解决向服务器传递裁剪参数

$('#target').Jcrop({

onChange: showPreview,

onSelect: showPreview,

// ...其他options

});

在这两个回调函数中及时对裁剪系数进行更新,保存在html页面中的input hidden中,一共有六个系数

$('#x1').val(c.x); // 选择框最左上角的x坐标值

$('#y1').val(c.y); // 选择框最左上角的y坐标值

$('#x2').val(c.x2); // 选择框最右下角的x坐标值

$('#y2').val(c.y2); // 选择框最右下角的y坐标值

$('#w').val(c.w); // 选择框的宽度

$('#h').val(c.h); // 选择框的高度

那么问题来了。。。在用户选择图片后向服务器发送的是一张正常大小的图片,然后在jcrop页面中显示的是缩略过的图片,裁剪框是在缩略过的图片上进行的裁剪,因此还得向服务器发送一个缩略比例,因此在cutImage函数中将缩略比例存储在input hidden中

第六步:解决服务器裁剪图片

我这里使用的是php语言,因此用了php的GD库函数配合从前端获得传递过来的起始坐标(x,y)以及裁剪的宽高和缩略比例较为轻松的实现了,这里不细述了,有兴趣看源代码

jcrop php 头像裁剪,上传裁剪头像(Jcrop)相关推荐

  1. python代码图片头像_Flask 上传自定义头像的实例详解

    Flask Web 开发这本书基本上做完了,后面还需要温习,但是自己做的博客总觉得简陋了点,所以,在动脑子开发新功能 今天想到最基本的功能,自定义头像 那这样的功能,设计到2大基本功能块 1:如何进行 ...

  2. android仿支付宝头像裁剪,易用的头像裁剪上传、头像美化组件

    更新记录 3.4.2(2020-06-30) 参数优化 3.3.4(2020-06-24) 支付宝平台必须填写noTab参数 查看更多 十分抱歉,因为精力有限,本插件暂停维护 注意: 1) H5平台, ...

  3. android 头像存储,安卓裁剪上传保存头像

    private String[] items = new String[] { "图库", "拍照" }; private static final int I ...

  4. 基于cropper和sweetalert的简单图片/头像裁剪上传

    基本功能 前端基本样式: 进行图片裁剪及上传: 点击上传后,js会将截取到的数据转为图片数据利用ajax发送给后台进行存储.存储成功后,刷新前端页面,头像改变. 上传成功后:自动刷新网页,更改头像 基 ...

  5. cropper.js 实现HTML5 裁剪上传头像

    cropper.js 实现HTML5 裁剪图片并上传(裁剪上传头像.) option相关参数说明: viewMode 显示模式 Type: Number Default: 0 Options: 0: ...

  6. vue 移动端头像裁剪_vue头像上传裁剪组件_一个漂亮的Vue组件,用于图像裁剪和上传...

    vue头像上传裁剪组件 vue-image-crop-upload (vue-image-crop-upload) A beautiful vue component for image crop a ...

  7. 1小时搞定cropper.js制作头像/图片上传、裁剪、并发送至后端

    1小时搞定cropper.js制作头像/图片上传.裁剪.并发送至后端 先给大家看一下最终效果. 大多数功能都是由Cropper.js封装好的,调整并制作了: 上传图片 对图片的裁剪以及调整(旋转.缩放 ...

  8. 小程序图片裁剪插件image-cropper实现个人头像上传裁剪功能

    小程序图片裁剪插件image-cropper实现个人头像上传裁剪功能 参考文档:小程序图片裁剪插件 image-cropper 整体效果流程图 一.第一步引入image-cropper,放在dist文 ...

  9. html头像裁剪仿微信,使用canvas实现仿新浪微博头像截取上传功能

    最近看到微博头像上传功能很感兴趣,于是就使用canvas写了一个,本文写的不好还请见谅.本程序目前在谷歌浏览器和火狐浏览器测试可用,ie浏览器无法支持. 因为ie的安全机制不允许img使用本地路径,所 ...

最新文章

  1. Ramsey定理数学
  2. 机器学习系列(5)_从白富美相亲名单看特征选择与预处理(上)
  3. APP论坛社区软件源码 APP封装
  4. Spring : 连接池-HikariCP
  5. HttpWebRequest 忽略证书
  6. githubRank: Github 项目和用户排行榜
  7. [Verilog] 实现数字钟(自动计时+手动校准+倒计时+设置闹钟)附完整源代码
  8. MATLAB学习笔记之chirp信号的产生
  9. java:ToStringBuilder.reflectionToString重写toString
  10. xshell如何设置选中复制_Xshell
  11. 【Spring】Spring使用xml注入为属性赋值
  12. 233621蓝牙2.1无线音箱B700A小测
  13. argument type mismatch
  14. Vba实现按选定类型排序标记
  15. i3 7100黑苹果_黑苹果系统是否好用?
  16. 什么是恒流源?如何工作的?
  17. GitHub开源:升讯威 SQLite 增强组件 Sheng.SQLite.Plus
  18. 前端如何实现词云效果?
  19. MySQL报错 Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl
  20. 【自己制作数据集】制作标注并生成mask

热门文章

  1. RAM、ROM、内存、存储、外存、硬盘的理解
  2. java源代码众筹网站_【JavaWeb项目】一个众筹网站的开发(三)第一个网页
  3. VS 2015 运行代码出现的问题
  4. 【GRPC】JAVA调用go实现负载均衡(RoundRobin)
  5. 【算法导论】多项式求和
  6. Zjh游戏(四)应用层的实现
  7. 内强体质外塑形象 东方美琪·安琪:北京四川商会举办宣讲专题
  8. 美团 2021 届秋季校园招聘—偏爱字母(转化+动态规划)
  9. 普歌:DOM知识点大盘点(一)
  10. java printwriter实例_Java PrintWriter 类