使用jquery的imagecropper插件做用户头像上传 兼容移动端
在移动端开发的过程中,或许会遇到对图片裁剪的问题。当然遇到问题问题,不管你想什么方法都是要进行解决的,哪怕是丑点,难看点,都得去解决掉。
图片裁剪的jquery插件有很多,我也测试过很多,不过大多数都是支持pc端的图片裁剪,而支持移动端图片裁剪的少,很流畅的可能就会更少了。
作为一个新手,我尝试了很多种解决方法,在初始的时候尝试自己写一个jquery插件支持触屏事件等,写出来了,但是觉得都不好意思拿出手,更别说拿出来商用了。
又尝试找了一些插件,一个个试。最后综合评价,感觉还不错的jquery插件:cropper这个jquery创建。
看了一下感觉还是挺简单的。demo:http://fengyuanchen.github.io/cropper/
下面就是我使用过程的一些代码,希望能对大家有所帮助。
插件导入:
- <link rel="stylesheet" href="/css/delimg/cropper.css"/>
- <script src="/js/libs/jquery.min.js"></script>
- <script src="/js/delimg/cropper.js"></script>
必要的一点html代码:
- <div class="img-container">
- <img src="" alt="">
- </div>
注意:一般情况下,图片会动态生成,所以当前的src值,为空。如果你是静态图片进行图片截取,那就更简单了。看下面代码就懂了。
插件的使用(很简单):
- var $image = $('.img-container > img');
- $image.attr("src", imgurl);
- $image.on("load", function() { // 等待图片加载成功后,才进行图片的裁剪功能
- $image.cropper({
- aspectRatio: 1 / 1 // 1:1的比例进行裁剪,可以是任意比例,自己调整
- });
- })
现在只是做了一个框架,最主要的是下面的代码,获取到图片的数据才是最主要的,所以我们需要利用到canvas的特异功能,将图片裁剪的部分转化为base64的字符串进行前后端数据的交互。
然而,cropper并不会给你提供现成的base64字符串,但是他给你了一串的数据对象,供你自己任意发挥。
点击某个按钮时,确定剪裁这一高亮的部分:
- $(selector).on("tap", function() {
- var src = $image.eq(0).attr("src");
- var canvasdata = $image.cropper("getCanvasData");
- var cropBoxData = $image.cropper('getCropBoxData');
- convertToData(src, canvasdata, cropBoxData, function(basechar) {
- // 回调后的函数处理
- });
- })
当然这也不是重点,重点是下面这个函数处理:
- function convertToData(url, canvasdata, cropdata, callback) {
- var cropw = cropdata.width; // 剪切的宽
- var croph = cropdata.height; // 剪切的宽
- var imgw = canvasdata.width; // 图片缩放或则放大后的高
- var imgh = canvasdata.height; // 图片缩放或则放大后的高
- var poleft = canvasdata.left - cropdata.left; // canvas定位图片的左边位置
- var potop = canvasdata.top - cropdata.top; // canvas定位图片的上边位置
- var canvas = document.createElement("canvas");
- var ctx = canvas.getContext('2d');
- canvas.width = cropw;
- canvas.height = croph;
- var img = new Image();
- img.src = url;
- img.onload = function() {
- this.width = imgw;
- this.height = imgh;
- // 这里主要是懂得canvas与图片的裁剪之间的关系位置
- ctx.drawImage(this, poleft, potop, this.width, this.height);
- var base64 = canvas.toDataURL('image/jpg', 1); // 这里的“1”是指的是处理图片的清晰度(0-1)之间,当然越小图片越模糊,处理后的图片大小也就越小
- callback && callback(base64) // 回调base64字符串
- }
- }
请看demo:http://www.asheep.cn/demo/cropper/
好啦,就到这里了,该处理的东西都处理了,当然这里一个放大缩小的正向处理剪裁,如果需要对图片的旋转等一些列的操作的话,也是可以得,这里只是给大家展示一个简单的demo的实现,如果有用得上的,可以作为参考。
实现方案:使用jquery的imagecropper.js插件中裁剪功能来实现
imagecropper.js这个源码我找了很久才找到http://pan.baidu.com/s/1oDqRO
代码量很少就没有写注释了
css
- <style>
- body
- {
- padding: 0;
- margin: 0;
- height: 100%;
- #eee;
- font-size: 12px;
- color: #666;
- }
- a
- {
- text-decoration: none;
- color: #333;
- }
- a:hover
- {
- text-decoration: none;
- color: #f00;
- }
- #container
- {
- position: absolute;
- left: 20px;
- top: 20px;
- }
- #wrapper
- {
- position: absolute;
- left: 0px;
- top: 40px;
- }
- #cropper
- {
- position: absolute;
- left: 0px;
- top: 0px;
- border: 1px solid #ccc;
- }
- #previewContainer
- {
- position: absolute;
- left: 350px;
- top: 60px;
- }
- .preview
- {
- border: 1px solid #ccc;
- }
- #selectBtn
- {
- position: absolute;
- left: 0px;
- top: 0px;
- width: 119px;
- height: 27px;
- }
- #saveBtn
- {
- position: absolute;
- left: 150px;
- top: 0px;
- width: 67px;
- height: 27px;
- }
- #rotateLeftBtn
- {
- position: absolute;
- left: 0px;
- top: 315px;
- width: 100px;
- height: 22px;
- padding-left: 25px;
- padding-top: 2px;
- }
- #rotateRightBtn
- {
- position: absolute;
- left: 225px;
- top: 315px;
- width: 50px;
- height: 22px;
- padding-right: 25px;
- padding-top: 2px;
- }
- </style>
html
- <body onload="init();">
- <div id="container">
- <a id="selectBtn" href="javascript:void(0);" onclick="document.getElementById('input').click();">选择</a>
- <a id="saveBtn" href="javascript:void(0);" onclick="saveImage();">保存</a>
- <input type="file" id="input" size="10" style="visibility:hidden;" onchange="selectImage(this.files)" />
- <div id="wrapper">
- <canvas id="cropper"></canvas>
- <a id="rotateLeftBtn" href="javascript:void(0);" onclick="rotateImage(event);">向左旋转</a>
- <a id="rotateRightBtn" href="javascript:void(0);" onclick="rotateImage(event);">向右旋转</a>
- <span id="status" style="position:absolute;left:350px;top:10px;width:100px;"></span>
- <div id="previewContainer">
- <canvas id="preview180" width="180" height="180" class="preview"></canvas>
- <span style="display:block;width:100%;padding-top:5px;text-align:center;">大尺寸图片,180x180像素</span>
- <canvas id="preview100" width="100" height="100" style="position:absolute;left:230px;top:0px;" class="preview"></canvas>
- <span style="position:absolute;left:230px;top:110px;width:100px;text-align:center;">中尺寸图片 100x100像素</span>
- <canvas id="preview50" width="50" height="50" style="position:absolute;left:255px;top:150px;" class="preview"></canvas>
- <span style="position:absolute;left:245px;top:210px;width:70px;text-align:center;">小尺寸图片 50x50像素</span>
- </div>
- </div>
- </div>
- </body>
最后是js部分了
- var cropper;
- function init()
- {
- //绑定
- cropper = new ImageCropper(300, 300, 180, 180);
- cropper.setCanvas("cropper");
- cropper.addPreview("preview180");
- cropper.addPreview("preview100");
- cropper.addPreview("preview50");
- //检测用户浏览器是否支持imagecropper插件
- if(!cropper.isAvaiable())
- {
- alert("Sorry, your browser doesn't support FileReader, please use Firefox3.6+ or Chrome10+ to run it.");
- }
- }
- //打开本地图片
- function selectImage(fileList)
- {
- cropper.loadImage(fileList[0]);
- }
- //旋转图片
- function rotateImage(e)
- {
- switch(e.target.id)
- {
- case "rotateLeftBtn":
- cropper.rotate(-90);
- break;
- case "rotateRightBtn":
- cropper.rotate(90);
- break;
- }
- }
- //上传图片
- function saveImage()
- {
- //选个你需要的大小
- var imgData = cropper.getCroppedImageData(180, 180);
- console.log("上传了:"+imgData);
- //在这里写你的上传代码
- }
使用jquery的imagecropper插件做用户头像上传 兼容移动端的更多相关文章
- jquery.form 和MVC4做无刷新上传DEMO
jquery.form 和MVC4做无刷新上传DEMO HTML: <script src="~/Scripts/jquery-1.10.2.min.js"></ ...
- spring--mvc添加用户及用户头像上传
spring--mvc添加用户及用户头像上传 添加用户步骤: 1.用ajax获取省份信息 2.添加用户 代码:register.jsp <meta http-equiv="Conten ...
- PHP+ajaxfileupload与jcrop插件结合 完成头像上传
昨天花了点时间整合了一下头像插件 东拼西凑的成果 先来看下效果
- Django项目实战之用户头像上传与访问
1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> < ...
- JQUery利用Uploadify插件实现文件异步上传(十一)
一:简介: Uploadify是JQuery的一个上传插件,实现的效果非常好,带进度显示 ,且Ajax异步,能一次性上传多个文件,功能强大,使用简单 1.支持单文件或多文件上传,可控制并发上传的文件数 ...
- Django用户头像上传
1 将文件保存到服务器本地 upload.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!DOCTYPE html> <html ...
- Django项目实战—用户头像上传
1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> <me ...
- jquery的uploadify插件实现的批量上传V3.2.1版
你需要如下配置(包括引入文件)HTML: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&quo ...
- Vue+axios+Node+express实现文件上传(用户头像上传)
Vue 页面的代码 <label for='my_file' class="theme-color"> <mu-icon left value="bac ...
随机推荐
- uboot中添加FIQ中断及相关问题
本文主要说明了在uboot中添加FIQ中断时遇到的问题以及对应的解决办法. 首先交代一下项目的软硬件环境.硬件方面,使用s3c2440作为主控芯片,外接串口.网卡等设备.软件方面,主控芯片上电后运行u ...
- Address already in use:JVM_Bind
1.原因:端口被占用 2.解决方式: 方式一:重启电脑 方式二:方式一不行执行方式二 双击Tomcat server 将Ports下HTTP/1.1对应的Port Number 改为其他值 备注: ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 解决方法
Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- 使用RMAN备份数据库
1.1使用控制文件备份全库 1.1.1配置备份路径 1.1.2 RMAN备份全库 1.2使用catalog数据库备份全库 1.2.1配置到远程数据库的TNS 1.2.2创建表空间及设置用户 1.2.3 ...
- SQL Server 2008 下载及安装教程
sql server 2008 是微软公司开发的一套数据库管理系统.是目前大型数据库中常用数据库之一.性能稳定,功能强大,是面向中大型企业的一款数据库解决方案.我们安装SqlServer2008的时候 ...
- BizTalk动手实验(十二)WCF-Oracle适配器使用
1 课程简介 通过本课程熟悉WCF-Oracle适配器的的使用 2 准备工作 1. 新建BizTalk空项目 2. 配置BizTalk项目的应用程序名称及程序签名. 3. Oracle数据库 ( Or ...
- LaTex 插入图片
\usepackage{mathrsfs} \usepackage{amsmath} \usepackage{graphicx} 宏包 \includegraphics{graph01.eps} %插 ...
- 【iCore3 双核心板】例程三十:U_DISK_IAP_FPGA实验——更新升级FPGA
实验指导书及代码包下载: http://pan.baidu.com/s/1jH1TiKY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- js中的text(),html() ,val()的区别
js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...
- 使用 JavaScript 实现链表
代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8 ...