首页 > 作文

HTML5移动开发图片压缩上传功能

更新时间:2023-04-06 21:01:02 阅读: 评论:0

h5活动已十分普遍,其中一种形式是让用户上传图片进行参与。移动端上传图片,用户一般都是上传手机相册中的图片,而现在手机的拍摄质量越来越高,一般单张照片的尺寸都在3m左右。若直接上传,十分耗流量,并且体验效果也不佳。因此需要在上传之前,先进行本地压缩。

接下来总结在h5活动的开发中图片压缩上传的功能,并标记其中踩过的几个坑,分享给大家:

小白区必看

对于移动端图片上传毫无概念的话,需要补充filereader、blob、formdat圣诞节朋友圈文案a三个概念。

1.filereader

定义

使用filereader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用file对象或者blob对象来指定所要处理的文件或数据.

方法

事件处理程序

使用

var filere婴儿哭闹的原因ader = new filereader();filereader.onload = function() {    var url = this.result;}//orfilereader.onload = function(e) {    var url = e.target.result;}

2.blob

blob(binary large object),二进制大对象,是一个可以存储二进制文件的容器。

3.formdata

利用formdata对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用xmlhttprequest发送这个”表单”.

正题

移动端图片压缩上传过程:

1)input file上传图片,使用filereader读取用户上传的图片;

2)图片数据传入img对象,将img绘制到canvas上,再使用canvas.todataurl进行压缩;

3)获取压缩后的ba64格式图片数据,转成二进制,塞入formdata,最后通过xmlhttprequest提交formdata;

1.获取图片数据

fileele.onchange = function() {    if (!this.files.length) return;    //以下考虑的是单图情况    var _ua = window.navigator.uragent;    var _simplefile = this.files[0];    //判断是否为图片    if (!/\/(?:jpeg|png|gif)/i.test(_simplefile.type)) return;    //插件exif.js获取ios图片的方向信息    var _orientation;    if(_ua.indexof('iphone') > 0) {        exif.getdata(_simplefile,function(){            _orientation=exif.gettag(this,'orientation');        });    }    //1.读取文件,通过filereader,将图片文件转化为dataurl,即data:img/png;ba64,开头的url,可以直接放在image.src中;    var _reader = new filereader(),        _img = new image(),        _url;    _reader.onload = function() {        _url = this.result;        _img.url = _url;        _img.onload = function () {            var _data = compress(_img);            again歌词uploadphoto(_data, _orientation);        };    };    _reader.readasdataurl(_simplefile);};

2.压缩图片

/** * 计算图片的尺寸,根据尺寸压缩 * 1. iphone手机html5上传图片方向问题,借助exif.js * 2. 安卓uc浏览器不支持 new blob(),使用blobbuilder * @param  {object} _img         图片 * @param  {number} _orientation 照片信息 * @return {string}              压缩后ba64格式的图片 */function compress(_img, _orientation) {    //2.计算符合目标尺寸宽高值,若上传图片的宽高都大于目标图,对目标图等比压缩;如果有一边小于,对上传图片等比放大。    var _goalwidth = 750,                  //目标宽度        _goalheight = 750,                 //目标高度        _imgwidth = _img.naturalwidth,     //图片宽度        _imgheight = _img.naturalheight,   //图片高度        _tempwidth = _imgwidth,            //放大或缩小后的临时宽度        _tempheight = _imgheight,          //放大或缩小后的临时宽度        _r = 0;                            //压缩比    if(_imgwidth === _goalwidth && _imgheight === _goalheight) {    } el if(_imgwidth > _goalwidth && _imgheight > _goalheight) {//宽高都大于目标图,需等比压缩        _r = _imgwidth / _goalwidth;        if(_imgheight / _goalheight < _r) {            _r = _imgheight / _goalheight;        }        _tempwidth = math.ceil(_imgwidth / _r);        _tempheight = math.ceil(_imgheight / _r);    } el {        if(_imgwidth < _goalwidth && _imgheight < _goalheight) {//宽高都小于            _r = _goalwidth / _imgwidth;            if(_goalheight / _imgheight < _r) {                _r = _goalheight / _imgheight;            }        } el {            if(_imgwidth < _goalwidth) {         //宽小于                _r = _goalwidth / _imgwidth;            } el{                              //高小于                _r = _goalheight / _imgheight;            }        }        _tempwidth = math.ceil(_imgwidth * _r);        _tempheight = math.ceil(_imgheight * _r);    }    //3.利用canvas对图片进行裁剪,等比放大或缩小后进行居中裁剪    var _canvas = e._$get('canvas-clip');    if(!_canvas.getcontext) return;    va机遇是成功的关键r _context = _canvas.getcontext('2d');    _canvas.width = _tempwidth;    _canvas.height = _tempheight;    var _degree;    //ios bug,iphone手机上可能会遇到图片方向错误问题    switch(_orientation){       //iphone横屏拍摄,此时home键在左侧        ca 3:            _degree=180;            _tempwidth=-_imgwidth;            _tempheight=-_imgheight;            break;        //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向)        ca 6:            _canvas.width=_imgheight;            _canvas.height=_imgwidth;             _degree=90;            _tempwidth=_imgwidth;            _tempheight=-_imgheight;            break;        //iphone竖屏拍摄,此时home键在上方        ca 8:            _canvas.width=_imgheight;            _canvas.height=_imgwidth;             _degree=270;            _tempwidth=-_imgwidth;            _tempheight=_imgheight;            break;    }    if(window.navigator.uragent.indexof('iphone') > 0 && !!_degree) {        _context.rotate(_degree*math.pi/180);        _context.drawimage(_img, 0, 0, _tempwidth, _tempheight);     } el {        _context.drawimage(_img, 0, 0, _tempwidth, _tempheight);    }    //todataurl方法,可以获取格式为"data:image/png;ba64,***"的ba64图片信息;    var _data = _canvas.todataurl('image/jpeg');    return _data;}

3.上传图片

/** * 上传图片到nos * @param  {object} _blog blob格式的图片 * @return {void} */function uploadphoto(_data) {    //4.获取canvas中的图片信息    //window.atob方法将其中的ba64格式的图片转换成二进制字符串;若将转换后的值直接赋值给blob会报错,需uint8array转换:最后创建blob对象;    _data = _data.split(',')[1];    _data = window.atob(_data);    //如果不用arraybuffer,发送给服务器的图片格式是[object uint8array],上传失败...    var _buffer = new arraybuffer(_data.length);    var _ubuffer = new uint8array(_buffer);    for (var i = 0; i < _data.length; i++) {        _ubuffer[i] = _data.charcodeat(i);    }    // 安卓 uc浏览器不支持 new blob(),使用blobbuilder    var _blob;    try {        _blob = new blob([_buffer], {type:'image/jpeg'});    } catch(ee) {        window.blobbuilder = window.blobbuilder || window.webkitblobbuilder || window.mozblobbuilder || window.msblobbuilder;        if (ee.name == 'typeerror' && window.blobbuilder) {            var _bb = new blobbuilder();            _bb.append(_buffer);            _blob = _bb.getblob('image/jpeg');        }    }    var _suffix = 'jpg';    if(_blob.type === 'image/jpeg') {        _suffix = 'jpg';    }    //获取nostoken    this.__cache._$requestdwrbyget({url: 'imagebean.gentokens',param: [_suffix,'','','','1'],onload: function(_tokens) {        _tokens = _tokens || [];        var _token = _tokens[0];        if(!_token || !_token.objectname || !_token.uploadtoken){            alert('token获取失败!');            return fal;        }        //上传图片到nos        var _objectname = _token.objectname,            _uploadtoken = _token.uploadtoken,            _bucketname = _token.bucketname;        var _formdata = new formdata();        _formdata.append('object', _objectname);        _formdata.append('x-nos-token', _uploadtoken);        _formdata.append('file',_blob);        var _xhr;        if (window.xmlhttprequest) {            _xhr = new window.xmlhttprequest();        } el if (window.activexobject) {            _xhr = new activexobject("microsoft.xmlhttp");        }        _xhr.onreadystatechange = function() {            if(_xhr.readystate === 4) {                if((_xhr.status >= 200 && _xhr.status < 300) || _xhr.status === 304) {                    var _imgurl = "http://nos.netea.com/" + _bucketname + "/" + _objectname + "?imageview";                    var _newurl = mb.x._$imgresize(_imgurl, 750, 750, 1, true);                    window.location.href = '/d/file/titlepic/taxiu' + _newurl;                }            }        };        _xhr.open('post', 'http://nos.netea.com/' + _bucketname, true);        _xhr.nd(_formdata);    }});}

判断iphone拍摄图片方向的插件:

以上所述是巴金家www.887551.com给大家介绍的html5移动开发图片压缩上传功能,实现一个模拟后台数据登入的效果,希望对大家有所帮助

本文发布于:2023-04-06 21:01:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f446bebc1b7be77cc8e6084ee39f199c.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:HTML5移动开发图片压缩上传功能.doc

本文 PDF 下载地址:HTML5移动开发图片压缩上传功能.pdf

下一篇:返回列表
标签:图片   上传图片   上传   对象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图