Heim  >  Artikel  >  Web-Frontend  >  Codebeispiel für die Bildkomprimierungs-Upload-Funktion für die mobile HTML5-Entwicklung

Codebeispiel für die Bildkomprimierungs-Upload-Funktion für die mobile HTML5-Entwicklung

黄舟
黄舟Original
2017-03-14 15:55:071913Durchsuche

Mobiler Clientlädt Bilder hoch Heutzutage wird die Aufnahmequalität von Mobiltelefonen immer höher Ein einzelnes Foto ist etwa 3 MB groß und muss daher vor dem Hochladen lokal komprimiert werden. Nachfolgend stellt Ihnen der Herausgeber von Script House die HTML5-Bildkomprimierungs- und Upload-Funktion für die mobile Entwicklung vor. Freunde, die sich für die HTML5-Bildkomprimierungs- und Upload-Funktion interessieren, sollten einen Blick auf die

H5-Aktivitäten werfen Eine Möglichkeit besteht darin, Benutzern das Hochladen von Bildern zur Teilnahme zu ermöglichen. Beim Hochladen von Bildern auf das mobile Endgerät laden Benutzer normalerweise Bilder aus dem Mobiltelefonalbum hoch. Heutzutage wird die Aufnahmequalität von Mobiltelefonen immer höher und die Größe eines einzelnen Fotos liegt im Allgemeinen bei etwa 3 Millionen. Wenn Sie es direkt hochladen, verbraucht es viel Verkehr und die Erfahrung ist nicht gut. Daher muss vor dem Hochladen eine lokale Komprimierung durchgeführt werden.

Als nächstes werden wir die Bildkomprimierungs- und Upload-Funktion bei der Entwicklung von h5-Aktivitäten zusammenfassen, einige Fallstricke markieren, auf die wir gestoßen sind, und sie mit allen teilen:

Ein Muss für Anfänger

Wenn Sie keine Ahnung vom mobilen Hochladen von Bildern haben, müssen Sie drei Konzepte hinzufügen: DateiReader, Blob und FürmData.

1.FileReader

Definition

Mit dem FileReader-Objekt können Webanwendungen auf dem Computer des Benutzers gespeicherte Dateien asynchron lesen Sie können das Dateiobjekt oder das Blob-Objekt verwenden, um die zu verarbeitende Datei oder die zu verarbeitenden Daten

Codebeispiel für die Bildkomprimierungs-Upload-Funktion für die mobile HTML5-Entwicklung

Ereignishandler

Programm

VerwendenCodebeispiel für die Bildkomprimierungs-Upload-Funktion für die mobile HTML5-Entwicklung


2.Blob
var fileReader = new FileReader();
fileReader.onload = function() {
    var url = this.result;
}
//or
fileReader.onload = function(e) {
    var url = e.target.result;
}

BLOB ( Binary Large Object

), ein Binary Large Object, ist ein Container, der Binärdateien speichern kann.

3.FormData

Mit dem FormData-Objekt können Sie eine Reihe von Schlüssel-Wert-Paaren verwenden, um ein vollständiges Formular zu simulieren, und dann XML HttpRequest sendet dieses „Formular“.

Hauptthema

Mobile Bildkomprimierungs-Upload-Prozess:

1) Eingabe Datei-Upload Verwenden Sie für Bilder FileReader, um von Benutzern hochgeladene Bilder zu lesen. 2) Übergeben Sie die Bilddaten an das img-Objekt, zeichnen Sie das img auf

canvas

und verwenden Sie dann canvas.toDataURL für Komprimierung;

3) Holen Sie sich die komprimierten Bilddaten im Base64-Format, konvertieren Sie sie in Formdaten und senden Sie sie schließlich über xmlHttpRequest; Daten

2. Bilder komprimieren


fileEle.onchange = function() {
    if (!this.files.length) return;
    //以下考虑的是单图情况
    var _ua = window.navigator.userAgent;
    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;base64,开头的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);
            uploadPhoto(_data, _orientation);
        };
    };
    _reader.readAsDataURL(_simpleFile);
};

3. Bilder hochladen


/**
 * 计算图片的尺寸,根据尺寸压缩
 * 1. iphone手机html5上传图片方向问题,借助exif.js
 * 2. 安卓UC浏览器不支持 new Blob(),使用BlobBuilder
 * @param  {Object} _img         图片
 * @param  {Number} _orientation 照片信息
 * @return {String}              压缩后base64格式的图片
 */
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) {
    } else 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);
    } else {
        if(_imgWidth < _goalWidth && _imgHeight < _goalHeight) {//宽高都小于
            _r = _goalWidth / _imgWidth;
            if(_goalHeight / _imgHeight < _r) {
                _r = _goalHeight / _imgHeight;
            }
        } else {
            if(_imgWidth < _goalWidth) {         //宽小于
                _r = _goalWidth / _imgWidth;
            } else{                              //高小于
                _r = _goalHeight / _imgHeight;
            }
        }
        _tempWidth = Math.ceil(_imgWidth * _r);
        _tempHeight = Math.ceil(_imgHeight * _r);
    }
    //3.利用canvas对图片进行裁剪,等比放大或缩小后进行居中裁剪
    var _canvas = e._$get(&#39;canvas-clip&#39;);
    if(!_canvas.getContext) return;
    var _context = _canvas.getContext(&#39;2d&#39;);
    _canvas.width = _tempWidth;
    _canvas.height = _tempHeight;
    var _degree;
    //ios bug,iphone手机上可能会遇到图片方向错误问题
    switch(_orientation){
       //iphone横屏拍摄,此时home键在左侧
        case 3:
            _degree=180;
            _tempWidth=-_imgWidth;
            _tempHeight=-_imgHeight;
            break;
        //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向)
        case 6:
            _canvas.width=_imgHeight;
            _canvas.height=_imgWidth; 
            _degree=90;
            _tempWidth=_imgWidth;
            _tempHeight=-_imgHeight;
            break;
        //iphone竖屏拍摄,此时home键在上方
        case 8:
            _canvas.width=_imgHeight;
            _canvas.height=_imgWidth; 
            _degree=270;
            _tempWidth=-_imgWidth;
            _tempHeight=_imgHeight;
            break;
    }
    if(window.navigator.userAgent.indexOf(&#39;iphone&#39;) > 0 && !!_degree) {
        _context.rotate(_degree*Math.PI/180);
        _context.drawImage(_img, 0, 0, _tempWidth, _tempHeight); 
    } else {
        _context.drawImage(_img, 0, 0, _tempWidth, _tempHeight);
    }
    //toDataURL方法,可以获取格式为"data:image/png;base64,***"的base64图片信息;
    var _data = _canvas.toDataURL(&#39;image/jpeg&#39;);
    return _data;
}

Plug-in zur Bestimmung der Richtung der vom iPhone aufgenommenen Bilder: exif

Das obige ist der detaillierte Inhalt vonCodebeispiel für die Bildkomprimierungs-Upload-Funktion für die mobile HTML5-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn