ios 图片旋转问题

Posted 明媚下雨天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios 图片旋转问题相关的知识,希望对你有一定的参考价值。

 

问题

在移动端拍照并上传,在某些ios上会进行以西旋转,获取的图片源码,也是旋转过的,导致获取图片后,绘制图片出现问题。

要求

现要求全部统一图片为 树立形式。

原理:

1.在获取源码之前,要判断一下 是否为ios手机

2.旋转图片,旋转角度为多少

3.将图片重回绘制为正常树立图片

4.获取源码上传

 插件:

  exif-js

介绍:http://code.ciaoca.com/javascript/exif-js/

1.判断是ios还是安卓

  //判断手机类型安卓/ios

    function isandroid_ios() {

        var u = navigator.userAgent, app = navigator.appVersion;

        var isAndroid = u.indexOf(‘Android‘) > -1 || u.indexOf(‘Linux‘) > -1; //android终端或者uc浏览器 

        var isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 

        return isAndroid == true ? true : false;

    }

2.获取拍摄得照片是否旋转,角度为多少

技术图片
 //旋转图片操作
    function rotateImage(image) {

        var width = image.width;

        var height = image.height;

        var canvas = document.createElement("canvas")

        var ctx = canvas.getContext(2d);

        var newImage = new Image();

        EXIF.getData(image, function () {

            var orientation = EXIF.getTag(this, Orientation);
         
            switch (orientation) {

                //正常状态

                case 1:

                    console.log(旋转0°);
                
                    break;

                //旋转90度

                case 6:

                    console.log(旋转90°);

                    canvas.height = width;

                    canvas.width = height;

                    ctx.rotate(Math.PI / 2);

                    ctx.translate(0, -height);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //旋转180°

                case 3:

                    console.log(旋转180°);

                    canvas.height = height;

                    canvas.width = width;

                    ctx.rotate(Math.PI);

                    ctx.translate(-width, -height);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //旋转270°

                case 8:

                    console.log(旋转270°);

                    canvas.height = width;

                    canvas.width = height;

                    ctx.rotate(-Math.PI / 2);

                    ctx.translate(-height, 0);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //undefined时不旋转

                case undefined:

                    console.log(undefined  不旋转);
             
                    break;

            }

        });

        return newImage;

    }
View Code

完整代码

技术图片
    //判断手机类型安卓/ios

    function isAndroid_ios() {

        var u = navigator.userAgent, app = navigator.appVersion;

        var isAndroid = u.indexOf(Android) > -1 || u.indexOf(Linux) > -1; //android终端或者uc浏览器 

        var isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 

        return isAndroid == true ? true : false;

    }


    //获取 处理图片
    $("#file").change(function (e) {
        var file = this.files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function (e) {
            // console.log(this.result);
            // $(‘.person-img‘).attr(‘src‘, this.result);
            var result = this.result;
            $(".dialog").show();
            var img = new Image();
            img.src = result;

            img.onload = function () {
                if (!isAndroid_ios()) {
                    //如果是旋转得图片,将图片重新赋值
                    img = rotateImage(img);
                }
                 //处理 上传图片
                 upload(img)
    
            }
        }
    });

  
    //旋转图片操作
    function rotateImage(image) {

        //console.log(‘rotateImage‘);

        var width = image.width;

        var height = image.height;

        var canvas = document.createElement("canvas")

        var ctx = canvas.getContext(2d);

        var newImage = new Image();

        EXIF.getData(image, function () {

            var orientation = EXIF.getTag(this, Orientation);
            alert(orientation)
            switch (orientation) {

                //正常状态

                case 1:

                    console.log(旋转0°);

                    break;

                //旋转90度

                case 6:

                    console.log(旋转90°);

                    canvas.height = width;

                    canvas.width = height;

                    ctx.rotate(Math.PI / 2);

                    ctx.translate(0, -height);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //旋转180°

                case 3:

                    console.log(旋转180°);

                    canvas.height = height;

                    canvas.width = width;

                    ctx.rotate(Math.PI);

                    ctx.translate(-width, -height);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //旋转270°

                case 8:

                    console.log(旋转270°);

                    canvas.height = width;

                    canvas.width = height;

                    ctx.rotate(-Math.PI / 2);

                    ctx.translate(-height, 0);

                    ctx.drawImage(image, 0, 0);

                    imageDate = canvas.toDataURL(Image/jpeg, 1)

                    newImage.src = imageDate;

                    break;

                //undefined时不旋转

                case undefined:

                    console.log(undefined  不旋转);

                    break;

            }

        });

        return newImage;

    }                        
View Code

 

 

 

以上是关于ios 图片旋转问题的主要内容,如果未能解决你的问题,请参考以下文章

处理屏幕旋转上的片段重复(带有示例代码)

讲解一下iOS图片单指旋转缩放实现方法

使用 ActionBar 旋转 Android 的双片段

部分Android或IOS手机拍照后照片被旋转的问题

Butterknife 片段旋转给出 NullPointer

iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果