利用html5 canvas实现纯前端上传图片的裁剪
今天跟大家分享一个前端裁剪图片的方法.
许多网站都有设置用户头像的功能,用户可以选择一张本地的图片,然后用网站的裁剪工具进行裁剪,然后设置大小,位置合适的头像.
当然,网上也有一些用js写的诸如此类裁剪的插件,但是有许多都是前端将图片的一些裁剪参数(如坐标)传给后台,有java程序员进行真正的图片裁剪.今天自己研究了一些,做了一个纯前端裁剪的demo,如下:
1.html部分:
<div>
<input type="file" id="imgFile">
</div>
<div style="width: 300px;height: 300px;position: absolute;left: 300px;top: 0;display: inline-block">
<img id="demoImg" style="height: 300px;width: 300px" alt="">
<div style="width: 150px;height: 150px;border: 1px solid #4fb8e3;position: absolute;left: 0;top: 0;z-index: 1000" id="chooseBox"></div>
</div>
<div style="position: absolute;left: 700px;top: 0">
<canvas id="myCan" width="150" height="150"></canvas>
<button id="cut">裁剪文件</button>
<button id="btn">后台返回获取裁剪后的文件</button>
<img id="returnImg" alt="">
</div>
页面初始截图如下:

2.第二步进行文件选择后的预览操作
var can=document.getElementById("myCan");
var btn=document.getElementById("btn");
var returnImg=document.getElementById("returnImg");
var ctx=can.getContext("2d");
$('#imgFile').change(function () {
var file=$('#imgFile')[0].files[0];
var reader=new FileReader();
reader.onload= function (e) {
$('#demoImg').attr('src', e.target.result);
};
reader.readAsDataURL(file);
});

3.进行裁剪 注意到任务图像里面有一个蓝色边框的选择框(大小固定,没有做缩放),将蓝色选框移动到你需要的位置,点击裁剪文件
$('#cut').click(function () {
var newX=$('#chooseBox').position().left*3.45;
var newY=$('#chooseBox').position().top*2.6;
var img=document.getElementById("demoImg");
console.log(newX,newY);
ctx.drawImage(img,newX,newY,150*3.45,150*2.6,0,0,150,150);
});

4.将裁剪后的图片传给后台,并将返回的图片展示
btn.onclick=function () {
var data=can.toDataURL();
data=data.split(',')[1];
data=window.atob(data);
var ia = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {
ia[i] = data.charCodeAt(i);
}
var blob=new Blob([ia],{type:"image/png",endings:'transparent'});
var fd=new FormData();
console.log(blob);
fd.append('avatarFile',blob,'image.png');
var httprequest=new XMLHttpRequest();
httprequest.open('POST','/guest/avatar',true);
httprequest.send(fd);
httprequest.onreadystatechange= function () {
if(httprequest.status==200 && httprequest.readyState==4){
console.log(httprequest.responseText);
$('#returnImg').attr('src','/images/'+JSON.parse(httprequest.responseText).json);
}
};
};

整个demo的注意点有四点: 1.图片上传之后使用fileReader将图片文件转换成base64 png格式图片,从而实现预览 2.图像选择框的移动,mousedown,mouseup,mouseup事件的配合使用 3.html5 canvas实现图片裁剪后的效果展示 4.利用html5 formData,将图片文件转换成blob对象,传给后台 完整源码请移步我的github项目地址:
https://github.com/hyq2015/canvas_crop_img 参考文档:http://blog.csdn.net/cuixiping/article/details/45932793
https://segmentfault.com/a/1190000000754560 http://blog.csdn.net/oscar999/article/details/36373183
利用html5 canvas实现纯前端上传图片的裁剪的更多相关文章
- HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)
原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代 ...
- 利用html5调用本地摄像头拍照上传图片[转]
利用html5调用本地摄像头拍照上传图片 html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头, ...
- web图片前端裁剪功能实现_利用html5 canvas技术实现图片裁剪
用户上传头像然后截图的需求很常见,很多做法是把图像发送到后端,把裁剪后的结果发送给浏览器,这种方式会增加处理时延.最近正好学习了HTML5里的canvas,发现它的图片处理功能比较强大,就打算用can ...
- 利用html5调用本地摄像头拍照上传图片
这个是前台HTML的代码. <div id="contentHolder"> <video id="video" width="32 ...
- 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸
/** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...
- 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示
HTML5提供了Canvas对象,为画图应用提供了便利. Javascript可执行于浏览器中, 而不须要安装特定的编译器: 基于HTML5和Javascript语言, 可随时编写应用, 为算法測试带 ...
- html5 canvas 笔记五(合成与裁剪)
组合 Compositing globalCompositeOperation syntax: globalCompositeOperation = type 注意:下面所有例子中,蓝色方块是先绘制的 ...
- 8个经典炫酷的HTML5 Canvas动画欣赏
HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...
- 分享8款令人惊叹的HTML5 Canvas动画特效
HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...
随机推荐
- 关于JS 沙箱(转)
javascript中的沙箱并非传统意义上的沙箱,只是一种语法上的hack写法而已,javascript中处理模块依赖关系的闭包被称之为沙箱,和 ajax一样,这种sandbox coding风格是一 ...
- sap 常用表
MM 表名 EBAN 采购申请
- ArcEngine:The XY domain on the spatial reference is not set or invalid错误
在创建数据集的时候,提示The XY domain on the spatial reference is not set or invalid错误. 原因:未设置空间参考(ISpatialRefer ...
- .net学习笔记--使用抽象方法实现多态
在使用抽象方法实现多态之前,我们必须知道一些知识点: 1.抽象类不能被实例化: 2.抽象类可以包含非抽象成员,它们可以由其子类继承调用. 我们可以先创建一个Person的抽象类,代码如下: abstr ...
- 使用WebDriver遇到的那些坑
在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器.Selenium WebDriver的优点是支持的语言多,支持的浏览器多.主流的浏览器Chrome.Fi ...
- tnsnames.ora配置注意(连接新的数据库)
文件地址D:\app\think\product\11.2.0\instantclient_11_2\network\admin\tnsnames.ora# tnsnames.ora Network ...
- rest-assured : Restful API 测试利器 - 真正的黑盒单元测试(跟Spring-Boot更配哦,更新至spring-boot1.4.1)
{ "Author":"tomcat and jerry", "URL" :"http://www.cnblogs.com/tom ...
- 炫酷CSS
<!DOCTYPE html><!--To change this license header, choose License Headers in Project Propert ...
- [[UIScreen mainScreen] bounds]获取尺寸不对
http://www.cocoachina.com/bbs/read.php?tid-264373.html [[UIScreen mainScreen] bounds]获取尺寸不对 我在 ...
- android命令抓LOG
手机和电脑,在电脑上开3个命令窗口,分别输入如下3个命令分别抓取mainLog.radioLog和kernalLog adb logcat -v time >main.txt adb logca ...