最近一直在做手机端的网站,涉及到上传、压缩图片,我使用的是base64(大神不要嘲笑),在安卓端的时候还没有发现问题,但是一换到IOS端,就出现问题了(再吐槽一下,万恶的IOS),后来查找了一些资料,发现IOS在储存照片的时候会根据拍照的方向来储存,base64压缩的时候要先矫正方向才可以成功的上传和压缩

检测图片的方向要用的到 exif.js ,猛戳这里下载,这个插件可以获取到图片的原信息,同时获取图片的方向,下面开始上代码(不要问我代码是谁( ⊙ o ⊙ )):

<script type="text/javascript">
	window.onload = function(){
        var input = document.getElementById("file_input");
        var result,div;
 
        if(typeof FileReader==='undefined'){
            result.innerHTML = "抱歉,你的浏览器不支持 FileReader";
            input.setAttribute('disabled','disabled');
        }else{
            input.addEventListener('change',readFile,false);
        }
        function readFile(){   
                var file = this.files[0]; 
                var orientation;
              //EXIF js 可以读取图片的元信息 https://github.com/exif-js/exif-js
              EXIF.getData(file,function(){
                orientation=EXIF.getTag(this,'Orientation');
              });     
                //判断类型是不是图片  
                if(!/image\/\w+/.test(file.type)){     
                        alertmsg('请上传图片');  
                        return false;   
                }   
                var reader = new FileReader();   
                reader.readAsDataURL(file);   
                reader.onload = function(e){
                    getImgData(this.result,orientation,function(data){
                        result = '<div class="PicInput fl" id="PicInput"><img class="pic" src="'+data+'"><span class="DelInput"></span></div>';
                        div = document.createElement('div');
                        div.innerHTML = result;
                        document.getElementById('PicUpload').appendChild(div);
                        return false;
                    }); 
                }
        return false;   
        }
    return false;   
    }

    // @param {string} img 图片的base64
    // @param {int} dir exif获取的方向信息
    // @param {function} next 回调方法,返回校正方向后的base64
    function getImgData(img,dir,next){
     var image=new Image();
     image.onload=function(){
      var degree=0,drawWidth,drawHeight,width,height;
      drawWidth=this.naturalWidth;
      drawHeight=this.naturalHeight;
      //以下改变一下图片大小
      var maxSide = Math.max(drawWidth, drawHeight);
      if (maxSide > 1024) {
        var minSide = Math.min(drawWidth, drawHeight);
        minSide = minSide / maxSide * 1024;
        maxSide = 1024;
        if (drawWidth > drawHeight) {
          drawWidth = maxSide;
          drawHeight = minSide;
        } else {
          drawWidth = minSide;
          drawHeight = maxSide;
        }
      }
      var canvas=document.createElement('canvas');
      canvas.width=width=drawWidth;
      canvas.height=height=drawHeight; 
      var context=canvas.getContext('2d');
      //判断图片方向,重置canvas大小,确定旋转角度,iphone默认的是home键在右方的横屏拍摄方式
      switch(dir){
        //iphone横屏拍摄,此时home键在左侧
        case 3:
          degree=180;
          drawWidth=-width;
          drawHeight=-height;
          break;
        //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向)
        case 6:
          canvas.width=height;
          canvas.height=width; 
          degree=90;
          drawWidth=width;
          drawHeight=-height;
          break;
        //iphone竖屏拍摄,此时home键在上方
        case 8:
          canvas.width=height;
          canvas.height=width; 
          degree=270;
          drawWidth=-width;
          drawHeight=height;
          break;
      }
      //使用canvas旋转校正
      context.rotate(degree*Math.PI/180);
      context.drawImage(this,0,0,drawWidth,drawHeight);
      //返回校正图片
      next(canvas.toDataURL("image/jpeg",.6));
     }
     image.src=img;
    }
</script>

主要的代码就是这些,主要是运用exif.js获取图片的真实方向,然后画布来矫正方向,最后显示并压缩在页面中

代码完整实例在这里