使用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 ...
随机推荐
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
作者:唐老师,华清远见嵌入式学院讲师. 一.Android init进程启动 还是从Linux的启动开始吧.Linux被bootloader加载到了内存之后,开始运行,在初始化完 Linux运行环境之 ...
- C#面向对象之属性
1.属性的定义及使用 class MyClass { ; //属性的定义 private string name = ""; //属性的定义 public int Id { get ...
- HTML 插入视频
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
- windows 给ping加时间
@echo off set /p host=host Address: set logfile=Log_%host%.log echo Target Host = %host% >%logfil ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- PowerDesigner的使用二
PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今 最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesig ...
- C++类内存分布
http://www.cnblogs.com/jerry19880126/p/3616999.html#undefined 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看 ...
- cms修改栏目单页样式错位调整
if (dt.Rows[0]["ClassTemplet"].ToString().Trim() == "") { rows_key.Style.Value = ...
- spring log4j.properties 没有日志的问题
一. log4j.properties 1. log4j.properties放在spring工程的src/main/rescours目录下无法读取. 测试后发现需要把log4j.properti ...