修正ios h5上传图时的图片方向问题

.ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致

为了用户体验,需要把图片矫正成正常的图片。

需要用到一个 exif 插件 地址 https://github.com/exif-js/exif-js/

代码

function check_file(files){
         //校验收集表单数据
//          var formdata = new FormData();
         if(!files[0] || !/image\/\w+/.test(files[0].type)){

             $.hidePreloader();
                $(‘.li_imgs‘).children(‘.imgs‘).last().children().first().removeAttr(‘disabled‘);
                _deny_request = false;
                return;
             }

//          formdata.append("imgFile0", files[0]); 

         //处理IOS 拍照方向
          EXIF.getData(files[0],function(){
              Orientation = EXIF.getTag(this,‘Orientation‘);
          });
          var reader = new FileReader();
          reader.readAsDataURL(files[0]);
          reader.onload = function(e) {
            getImgData(e);
          }
          return;
}

//e 图片的base64
function getImgData(e){
     var image = new Image();
image.src = e.target.result;
image.onload = function() {
    var expectWidth = this.naturalWidth;
    var expectHeight = this.naturalHeight;  

    if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
        expectWidth = 800;
        expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
    } else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
        expectHeight = 1200;
        expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
    }
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    canvas.width = expectWidth;
    canvas.height = expectHeight;
    ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
    var base64 = null;
            //修复ios
            switch(Orientation){
                case 6://需要顺时针(向左)90度旋转
                    rotateImg(this,‘left‘,canvas);
                    break;
                case 8://需要逆时针(向右)90度旋转
                    rotateImg(this,‘right‘,canvas);
                    break;
                case 3://需要180度旋转
                    rotateImg(this,‘right‘,canvas);//转两次
                    rotateImg(this,‘right‘,canvas);
                    break;
            }
        base64 = canvas.toDataURL("image/jpeg", 0.7).substring(22);//这里处理一下base64编码头,以便php的 base64_decode可以解析,压缩一下图片,否则会413错误
        displayImg(base64);
    }
}

//对图片旋转处理
function rotateImg(img, direction,canvas) {
        //alert(img);
        //最小与最大旋转方向,图片旋转4次后回到原方向
        var min_step = 0;
        var max_step = 3;
        //var img = document.getElementById(pid);
        if (img == null)return;
        //img的高度和宽度不能在img元素隐藏后获取,否则会出错
        var height = img.height;
        var width = img.width;
        //var step = img.getAttribute(‘step‘);
        var step = 2;
        if (step == null) {
            step = min_step;
        }
        if (direction == ‘right‘) {
            step++;
            //旋转到原位置,即超过最大值
            step > max_step && (step = min_step);
        } else {
            step--;
            step < min_step && (step = max_step);
        }
        //旋转角度以弧度值为参数
        var degree = step * 90 * Math.PI / 180;
        var ctx = canvas.getContext(‘2d‘);
        switch (step) {
            case 0:
                canvas.width = width;
                canvas.height = height;
                ctx.drawImage(img, 0, 0);
                break;
            case 1:
                canvas.width = height;
                canvas.height = width;
                ctx.rotate(degree);
                ctx.drawImage(img, 0, -height);
                break;
            case 2:
                canvas.width = width;
                canvas.height = height;
                ctx.rotate(degree);
                ctx.drawImage(img, -width, -height);
                break;
            case 3:
                canvas.width = height;
                canvas.height = width;
                ctx.rotate(degree);
                ctx.drawImage(img, -width, 0);
                break;
        }
}  

/**
 * android / ios 图片上传
 */
function displayImg(imgBinaryContentbase64){
   remove_file_input($(‘.li_imgs‘).children(‘.imgs‘).last().children().first()); //删除旧的file域
   $.showPreloader(_up_img_msg);
  var data = {};
  if(_IsIosDev){
      data[‘ios‘] = imgBinaryContentbase64;
      }else{
          data[‘content‘] = imgBinaryContentbase64;
          }

  $.ajax({
      type:‘post‘,
      url:‘?c=bzymgr/washcar&a=uploadAndroidImg&openid=<?php echo $this->openid;?>‘,
      data:data,
      dataType: "json",
      async: true,
      success:function(res){
          if(res==‘0‘){
              public_toast(‘上传失败,请稍后重试‘,1000);
              return;
              }
          var html = ‘‘;
          for(var i in res){
              html += ‘<div class="imgs">\
                           <img src="‘+res[i]+‘" class="thumb_img"/>                           <b class="img_cancel" onclick="remove_img(this)">X</b>                    </div>‘;
              //存储到localStorage
              add_imgs_LocalStorage(res[i]);
              }
          //插入dom
          $(‘.li_imgs‘).children(‘.imgs‘).last().before(html);
          setTimeout(function(){
                  $.hidePreloader();
                  _deny_request = false;
                  },1000);
      },
      error:function(){
          public_toast(‘服务器离家出走了,请稍后重试‘,2000);
          },
  });
}
时间: 2024-11-10 00:03:46

修正ios h5上传图时的图片方向问题的相关文章

在使用 AjaxFileUpload 上传文件时,在项目发布到 iis 后,图片不能预览

在使用 AjaxFileUpload  上传文件时,图片已经上传成功了,在站点没有发布时,可以预览,可是在项目发布到 iis 后,图片就不能预览,在网上找了很多的方案也没解决,最后的解决方案如下: 1.开始运行 regedit 打开注册表,先备份注册表 2.找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 3.在 编辑 菜单上指向 新建 ,然后单击 DWORD 值 . 4.键入 EnableAggres

ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.

ios开发 上传到App Store 时出错. iTunes Store Operation Failed,    An Error occurred uploading to the iTunes store. 的解决方法,网上找了很多. 如下(当然没有解决我的问题,可以一试): 今天在提交app的时候,最后一步报错, An error occurred uploading to the iTunes Store! 后来上网查了查资料,在这里整理一下: 第一: 有可能是中文编码的问题,需要把编

解决ios手机上传竖拍照片旋转90度的问题

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 这里主要利用exif.js读取照片的拍摄信息. Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. EXIF 数据主要来自拍摄的照片,多用于移动端开发,PC

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

转:https://www.cnblogs.com/lovelgx/articles/8656615.html ---恢复内容开始--- 问题:html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 解决方法:利用exif.js解决ios手机上传竖拍照片旋转90度问题 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见 htt

Iphone H5上传照片被旋转

最近做项目发现在Iphone下,我们上传图片都会被翻转,最后查阅资料发现,的确是IOS的问题 不说过程,直接解决方法 iOS下,html方式使用<input type="file">上传图片,图片会被旋转.遇到这个问题js是无法解决的,html也没有相应的解决方案.只能放到后台去处理,将旋转的图片再旋转回来.iOS拍摄的图片提供了EXIF信息,Orientation值为6即顺时针90度,有了这个信息我们只需要逆时针旋转90度即可. 伪代码  //下面是php的伪代码 $ex

ios 文件上传

ASIHTTPRequest 框架支持文件的上传: 文件的上传使用ASIFormDataRequest; NSString *s = @"文件传输"; NSURL *url = [NSURL URLWithString:@"http://localhost:8080/text"];//传输地址 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; NSStringEncoding

php如何解析IOS/Android上传的Json消息

使用yii框架php服务器接收IOS/Android上传的Json消息时,$_POST. Yii::app()->request->getPost()结果都将为null. 使用file_get_contents("php://input")才能够正常获取. "php://input"可以访问请求的原始数据,并且带给内存的压力更小. 例子如下: class appController extends Controller { public function

ios 文件上传, post数据

一.文件下载 获取资源文件大小有两张方式 1. HTTP HEAD方法 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:kTimeout]; request.HTTPMethod = @"HEAD"; [NSURLConnection sendAsynchronousRequest:request queue:self.myQueue

java接受安卓及ios App上传的图片,并保存到阿里OSS

做后台的时候,写了两个方法,分别用来获取安卓和苹果IOS端上传的头像,保存到阿里云OSS图片存储服务器上.(SMM框架) 安卓及H5版本: 1 /** 2 * 上传用户头像 3 */ 4 @RequestMapping("/uploadPhoto") 5 public R uploadPhoto(@RequestParam("imgFile") MultipartFile imgFile, HttpServletRequest req) throws Excepti