前端解决图片旋转时遇到的问题记录

bug:

手机上传图片到服务器,有的电脑浏览器显示的图片会出现图片旋转问题。

思路一(错误):

由于是在显示的时候发现的bug,所以,一开始,是在显示的时候进行的处理。

百度到了许多原因。然后找到了以下处理方案。

经过测试,发现原本 " orientation=6 " 能够正常显示的全部旋转了90°......

<!-- 这里采用cdn形式引入exif -->
<script src="https://cdn.jsdelivr.net/npm/exif-js" charset="utf-8"></script>

......

res.data.pictures.forEach(function (k, v) {
    var file ="image/"+ k.path;
    //处理图片旋转
    let img = new Image();
    try {
        img.src = file;
    } catch (error) {
        img.src = window.URL.createObjectURL(file);
    }
    //图片预加载
    img.onload = function() {
        //获取图片源数据
        EXIF.getData(img, function () {
            //获取图片orientation值
            let orientation = EXIF.getTag(this, "Orientation");
            let canvas = document.createElement("canvas");
            let ctx = canvas.getContext("2d");
            switch (orientation) {
                case 3: // 旋转180°
                    alert(3);
                    canvas.width = img.width;
                    canvas.height = img.height;
                    ctx.rotate((180 * Math.PI) / 180);
                    ctx.drawImage(img, -img.width, -img.height, img.width, img.height);
                    break;
                case 6: // 旋转90°
                    alert(6);
                    canvas.width = img.height;
                    canvas.height = img.width;
                    ctx.rotate((90 * Math.PI) / 180);
                    ctx.drawImage(img, 0, -img.height, img.width, img.height);
                    break;
                case 8: // 旋转-90°
                    alert(8);
                    canvas.width = img.height;
                    canvas.height = img.width;
                    ctx.rotate((-90 * Math.PI) / 180);
                    ctx.drawImage(img, -img.width, 0, img.width, img.height);
                    break;
                default: // 没有源信息的图片和正常的图片是不需要旋转的
                    canvas.width = img.width;
                    canvas.height = img.height;
                    ctx.drawImage(img, 0, 0, img.width, img.height);
                    break;
            }
            file = canvas.toDataURL("image/png");
            $('#demo2').append('<img src="'+ file +'" class="layui-upload-img" height="150px">');
        });
    };
});

思路二(错误):

继续百度,有人说,在后端进行处理,删除图片exif 信息,删除后用户上传是什么样的,展示就是什么样。

由于没有苹果设备,就在电脑上进行了下测试。

①:从服务器上把苹果上传的那张图片下载到本地。

②:下载jhead.exe,复制到 C:\Windows路径下。

③:cmd运行命令

jhead -de D:/A.jpg
删除D盘盘根目录下A.jpg文件的exif信息。
jhead -de D:/*.jpg
删除D盘根目录下所有jpg文件的exif信息。其中星号是通配符。

然后,本地的图片的方向就旋转了......

后端小萌新哭了......

思路三:

经过询问前端大佬,原来应该在手机上传图片的时候进行处理。

百度原因总结:

①:手机中默认横排才是正确的拍照姿势。部分设备因为不同的拍摄角度,图片旋转的角度不一样,上传后的方向也不一样。在浏览器中旋转角度被忽略了,导致图片是旋转的。借助exif-js获取图片的源信息,判断 Orientation, 然后旋转对应的角度。

②:因为手机系统版本的不同,有些需要前端对其调整图片方向;有些不需要前端对其调整图片方向,无论倒着拍,还是旋转拍,图片上传后的方向都是正确的。

③:因为浏览器内核的不同,有些需要进行旋转,有些不需要进行旋转。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值