解决移动端iOS下上传图片被旋转问题。

web攻城狮

iOS下html上传图片被旋转

  1. 解决方法用exif.js+canvas

    既然是解决问题,那就简单说一下,直接上代码!

    html方式使用<input type="file">在iOS上可以直接调用照相机拍照,竖拍出来的图片都会变成横图!

    思路:获取到照片拍摄的方向角,对非横拍的ios照片使用canvas的rotate进行角度旋转修正。

    页面引入exif.js 网盘分享给你吧http://pan.baidu.com/s/1geNuzGf

    利用exif.js读取照片的拍摄信息,详见 http://code.ciaoca.com/javasc...

    这里主要用到Orientation属性。

   EXIF.getData(_ImgFile,  function() {     //_ImgFile图片数据
    var Orientation = EXIF.getTag(this, 'Orientation');   
     return Orientation                   //Orientation返回的参数 1 、3 、6 、8
    }); 
  

Orientation 参数 1、3、6、8 对应的你需要旋转的角度

1   0°
3   180°    
6   顺时针90°
8   逆时针90°

ios拍出来照片信息里面Orientation 是6 顺时针90°

         switch(Orientation){
                                case 6:     // 旋转90度
                                    widthORheight=0;
                                    cvs.width = this.height * scale;
                                    cvs.height = this.width * scale;
                                    ctx.rotate(Math.PI / 2);
                                    // (0,-imgHeight) 从旋转原理图那里获得的起始点
                                    ctx.drawImage(this, 0,-this.height * scale,  this.width * scale, this.height * scale  );
                                    break;
                                case 3:     // 旋转180度
                                    ctx.rotate(Math.PI);
                                    ctx.drawImage(this, -this.width * scale, -this.height * scale,  this.width * scale, this.height * scale);
                                    break;
                                case 8:     // 旋转-90度
                                    widthORheight=0;
                                    cvs.width = this.height * scale;
                                    cvs.height = this.width * scale;
                                    ctx.rotate(3 * Math.PI / 2);
                                    ctx.drawImage(this, - this.width * scale, 0,  this.width * scale, this.height * scale);
                                    break;

                            }


      


全部代码

htlm:

  <input id="showImg" type="file" name="image" accept="image/*"  multiple>
   <ul id="fileList" class="uploader-list"></ul>

css 随意

js

        // 转换blob对象用于上传
        function dataURLtoBlob(dataurl) {
            var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
            while(n--){
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], {type:mime});
        }
        
    
    var imgBlobIndex=[];  //存放多张图片的的容器。用于多张图片上传或者删除多张图片中某一张图片,
        

     $("#showImg").change(function() {
        var listNunber=$('#fileList').find('img').length,
            Orientation = null,
            _this = $(this)[0],
            _leng = this.files.length,
            maxSize = 2500000,// 限制单张大小2.5M
            minSize=100000;   //压缩临界 1M
           
                for (var j = 0; j < _leng; j++) {
                    var _filelist = _this.files[j],
                        fileType = _filelist.type,
                        size = _filelist.size;     //获取图片的大小
                    if (size < maxSize) {        
                                                  //获取图片Orientation参数
                        EXIF.getData(_filelist, function() {
                            Orientation = EXIF.getTag(this, 'Orientation');
                        });
                         
                        var fileReader = new FileReader();
                        fileReader.readAsDataURL(_filelist);
                        fileReader.onload = function (event) {
                            var result = event.target.result;   //返回的dataURL
                            var image = new Image();
                            image.src = result;
                            image.onload = function () {//创建一个image对象,给canvas绘制使用

                                var cvs = document.createElement('canvas');
                                var ctx = cvs.getContext('2d');
                                var scale = 1;          //预留压缩比
                    
                                cvs.width = this.width * scale;
                                cvs.height = this.height * scale;//计算等比缩小后图片宽高

                                if(Orientation && Orientation != 1){
                                    switch(Orientation){
                                        case 6:     // 旋转90度
                                            
                                            cvs.width = this.height * scale;
                                            cvs.height = this.width * scale;
                                            ctx.rotate(Math.PI / 2);
                                            // (0,-imgHeight) 从旋转原理图那里获得的起始点
                                            ctx.drawImage(this, 0,-this.height * scale,  this.width * scale, this.height * scale  );
                                            break;
                                        case 3:     // 旋转180度
                                            ctx.rotate(Math.PI);
                                            ctx.drawImage(this, this.width * scale, -this.height * scale,  this.width * scale, this.height * scale);
                                            break;
                                        case 8:     // 旋转-90度
                                        
                                            cvs.width = this.height * scale;
                                            cvs.height = this.width * scale;
                                            ctx.rotate(3 * Math.PI / 2);
                                            ctx.drawImage(this, - this.width * scale, 0,  this.width * scale, this.height * scale);
                                            break;

                                    }
                                }else{
                                    ctx.drawImage(this, 0, 0,  cvs.width, cvs.height);
                                }
                               /* ctx.drawImage(this, 0, 0, cvs.width, cvs.height);*/
                                if(size<minSize){    
                                     //小于压缩临界的,压缩0.7                              
                                    var newImageData = cvs.toDataURL(fileType, 0.7); 
                                }else {
                                     //大于压缩临界的,根据原图的大小动态设置压缩比
                                    var sca=1/(Math.sqrt([size/minSize])); //
                                    var newImageData = cvs.toDataURL(fileType, sca);
                                }
                                var img='<li class="list_b" data-id="'+imgid+'"><img  src="'+newImageData+'" class="removeImgname'+i+'" data-id="'+imgid+'"/></li>';  //创建预览对象
                                imgid++;
                                i++;
                                $('#fileList').append(img);   //图片预览容器

                                
                                var imgdata=dataURLtoBlob(newImageData);  //  创建blob 用于上传
                                imgBlobIndex.push(imgdata);                   //多张图片时上传用
                                                                
                            };
                        };
                    }else {    
                      alert('您照片大小超过2.5M了,请更换照片')
                    }
                }
           
      
    });
阅读 12.2k
169 声望
2 粉丝
0 条评论
169 声望
2 粉丝
文章目录
宣传栏