H5调取相机照相并紧缩图片-
整理文档,搜刮出一个H5调取相机照相并紧缩图片的实例代码,略微整理精简一下做下分享。
配景
比来要做一个h5的页面,主要功能就是调取相机照相或者是相册选图而且把相片紧缩转base64之后上传到后台办事器,然后办事器返回辨认效果。
前端的主要功能点有:
H5怎样调取相机
图片怎样紧缩
图片转base64
H5调取相机/相册
调取相机最简略的办法就是运用input file[camera]属性:
//相机 //相册
这个种办法兼容性还是有题目的,在苹果手机上可以正常打开相机,但是在安卓手机上点击之后是相机、图库、文件治理器等混合选中项。在网上搜了许多都没有什么好的解决方法,只能继续往下写了。。。
图片紧缩
图片紧缩就要用到FileReader
和了。
FileReader对象允许Web利用程序异步读取存储在盘算机上的文件的内容,运用File或Blob对象指定要读取的文件或数据。
图片紧缩要紧缩图片的辨论率和质量,辨论率紧缩我这里是设定了图片的最大边为800,另一边按照图片原有比例缩放,也可以设定图片整体的缩放比例。
var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH/ image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH/ image.width; image.width = MAX_WH; } } image.src=dataURL;//dataURL通过FileReader猎取
然后就是紧缩图片的质量了,这里设定紧缩了80%,要是设定太小图片就失真了。动态新建
var quality=80; var cvs = document.createElement('canvas'); cvs.width = image.width; cvs.heigh = image.height; var context=cvs.getContext("2d"); context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100);
然后就是上传到办事器并展现办事器的效果啦,然而事情并没有那么顺利。。。ios手机照相紧缩之后图片莫名的扭转了,继续解决题目。
解决IOS图片扭转
第一援用exif.js,通过EXIF.getData和EXIF.getTag猎取照相标的目的信息。
//file通过input标签猎取 EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); });
下面给出每个orientation值对应到苹果手机照相的含义:
orientation | 描述 |
---|---|
3 | 苹果横屏拍摄,此时home键在左侧,图片相关于原始位置扭转了180度 |
6 | 苹果竖屏拍摄,此时home键鄙人方(正常特长机的标的目的),图片相关于原始位置逆时针扭转可90度 |
8 | 苹果竖屏拍摄,此时home键在上方,图片相关于原始位置顺时针扭转了90度 |
猎取图片的标的目的信息之后,依据猎取到的值作响应的扭转操纵。
switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); switch(orientation){ //苹果横屏拍摄,此时home键在左侧 case 3: // 180度向左扭转 context.translate(width, height); context.rotate(Math.PI); break; //苹果竖屏拍摄,此时home键鄙人方(正常特长机的标的目的) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //苹果竖屏拍摄,此时home键在上方 case 8: // 逆时针扭转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; }
然后再上传图片,发明在IOS下图片已经正常了。
下面给出完备代码:
$('input[type=file]').change(function(e) { var file = this.files[0]; var mime_type=file.type; var orientation=0; if (file && /^image\//i.test(file.type)) { EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); }); var reader = new FileReader(); reader.onloadend = function () { var width,height; var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH / image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH / image.width; image.width = MAX_WH; } //紧缩 var quality=80; var cvs = document.createElement('canvas'); cvs.width = width = image.width; cvs.height =height = image.height; switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); //解决ios图片扭转题目 switch(orientation){ //苹果横屏拍摄,此时home键在左侧 case 3: // 180度向左扭转 context.translate(width, height); context.rotate(Math.PI); break; //苹果竖屏拍摄,此时home键鄙人方(正常特长机的标的目的) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //苹果竖屏拍摄,此时home键在上方 case 8: // 逆时针扭转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; } context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100); //猎取辨认效果 ... } image.src=dataURL; }; reader.readAsDataURL(file); }else{ alert("只能辨认图片!") } });
信赖看了本案牍例你已经把握了办法,更多出色请关注 百分百源码网 其它相干文章!
举荐浏览:
H5中History模式的运用详解
localstorage和sessionstorage运用记载
以上就是H5调取相机照相并紧缩图片的细致内容,更多请关注 百分百源码网 其它相干文章!