JavaScript+html5 canvas实实现现本本地地截截图图教教程程
最近有时间了解了下html5的各A PI,发现新浪微博的头像设置是使用canvas实现截图的, 之前段时间了解了下html5的File A P
I使用File A PI 之FileReader实现文件上传 《《JavaScript File A PI文文件件上上传传预预览览》》,,更 觉得html5好玩了,想着也试试写写这
功能权当学习canvas吧。
下面奉上我自己写的一个demo ,代码写得比较少,很多细节不会处理。如果有不得当的地方恳请指教,谢谢啦 ^_^ ^_^
功能实现步奏:
一一、、获获取取文文件件,,读读取取文文件件并并生生成成url
二二、、根根据据容容器器的的大大小小使使用用canvas绘绘制制图图片片
三三、、使使用用canvas绘绘制制遮遮罩罩层层
四四、、使使用用canvas绘绘制制裁裁剪剪后后的的图图片片
五五、、拖拖动动裁裁剪剪框框,,重重新新裁裁剪剪图图片片
PS :因为是先把demo写好再写这篇文章的,所以分段贴的代码是直接从代码里面一段段拷的,要留意this对象喔
第第一一步步::获获取取文文件件,,读读取取文文件件并并生生成成url
在这里我是使用html5里面的file api处理本地文件上传的,因为这样可以不需要把图片上传到服务器,再由服务器返回图片地址
来做预览,详细请看:使用File A PI 之FileReader实现文件上传
document.getElementById('post_file').onchange = function() {
var fileList = this.files 0];
var oFReader = new FileReader();
oFReader.readAsDataURL(fileList);
oFReader.onload = function (oFREvent) { //当读取操作成功完成时调用.
postFile.paintImage(oFREvent.target.result);//把预览图片url传给函数
};
}
第第二二步步::根根据据容容器器的的大大小小使使用用canvas绘绘制制图图片片
在上一步使用File A PI的FileReader 已经得到了需要上传图片的地址了,接下来需要使用canvas把这个图片绘制出来。这里为什么
不直接插入img而用canvas重新绘制呢,这不是多此一举了吗?其实不然。如果用img直接插入页面,就无法自适应居中了,如
果使用canvas绘制图片,不但能使图片自适应居中以及能等比例缩放,并且方便把图片的坐标,尺寸大小传给后来的遮罩层,这
样能根据图片的坐标以及图片的尺寸大小来绘制遮罩层。
这里稍微要注意下canvas的drawImage方法。
paintImage: function(url) {
var t = this;
var createCanvas = t.getImage.getContext("2d");
var img = new Image();
img.src = url;
img.onload = function(){
//等比例缩放图片(如果图片宽高都比容器小,则绘制的图片宽高 = 原图片的宽高。)
//如果图片的宽度或者高度比容器大,则宽度或者高度 = 容器的宽度或者高度,另一高度或者宽度则等比例
缩放
//t.imgWidth:绘制后图片的宽度;t.imgHeight:绘制后图片的高度;t.px:绘制后图片的X轴;t.py
:绘制后图片的Y轴
if ( img.width < t.regional.offsetWidth && img.height < t.regional.offsetHeight) {
t.imgWidth = img.width;
t.imgHeight = img.height;
} else {
var pWidth = img.width / (