博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决移动端iOS下上传图片被旋转问题。
阅读量:6230 次
发布时间:2019-06-21

本文共 6433 字,大约阅读时间需要 21 分钟。

iOS下html上传图片被旋转

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

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

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

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

    页面引入exif.js 网盘分享给你吧

    利用exif.js读取照片的拍摄信息,详见

    这里主要用到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:

   

    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
    '; //创建预览对象 imgid++; i++; $('#fileList').append(img); //图片预览容器 var imgdata=dataURLtoBlob(newImageData); // 创建blob 用于上传 imgBlobIndex.push(imgdata); //多张图片时上传用 }; }; }else { alert('您照片大小超过2.5M了,请更换照片') } } });

    转载地址:http://ipxna.baihongyu.com/

    你可能感兴趣的文章
    【转】网页禁止后退键BackSpace的JavaScript实现(兼容IE、Chrome、Firefox、Opera)
    查看>>
    登录界面点击登录后如何延迟提示成功的div的显示时间并跳转
    查看>>
    MySQL 数据库死锁
    查看>>
    关于try catch
    查看>>
    《C语言程序设计(第四版)》阅读心得(二)
    查看>>
    SQLSERVER执行计划详解
    查看>>
    【实用技巧】 修改度娘的提取码
    查看>>
    linux光驱挂到本地目录
    查看>>
    jQuery Ajax实例 ($.ajax_$.post_$.get)
    查看>>
    第一课JAVA开发环境配置
    查看>>
    linux的NFS详细配置方法
    查看>>
    Eclipse中Spring插件的安装及使用
    查看>>
    git 出现错误 Could not resolve host: github.com 或者 gitlab.com 或者gerrit相关( 自有服务 )...
    查看>>
    eclipse中启动项目报内存溢出问题通过修改配置解决
    查看>>
    垃圾桶丁
    查看>>
    Windows环境下python2.7安装mysql-python
    查看>>
    InnoDB的三个关键特性
    查看>>
    请教一个问题:关于 webrtc 通信的问题
    查看>>
    SDE里修改要素的已有字段的长度
    查看>>
    openStack高可用性和灾备方案
    查看>>