JS解决IOS中拍照图片预览旋转90度BUG的问题


Posted in Javascript onSeptember 13, 2017

上篇文章【Js利用Canvas实现图片压缩功能】中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度。对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编程了。通过度娘找到了相关资料,解决方法记录在此。这个问题的具体因素其实我还是不清楚是为何导致的,只有IOS和部分三星手机会出现此bug。 绝大部分的安卓机并无此问题。

解决此问题需要引入一个第三方 JS 库: exif.js 下载地址:https://github.com/exif-js/exif-js 通过exif.js 我们可以获取到图片的元信息,这其中就包括照片的拍照方向。

而 exif.js 给出的照片方向属性如下图:

JS解决IOS中拍照图片预览旋转90度BUG的问题

IOS中通过 exif.js ,获取拍照的图片的方向,返回的值为 6, 也就是上图最左边的 F 的情况。 这也正是我们的bug所在。 因此我们通过判断方向的值来做相应的处理,如果值为 6 ,则我们对图片进行旋转矫正。

具体代码如下:

//获取图片方向
function getPhotoOrientation(img) {
   var orient;
   EXIF.getData(img, function () {
      orient = EXIF.getTag(this, 'Orientation');
   });
   return orient;
}

接下来我们将上篇文章中的压缩函数修改如下:

//图片压缩
function compress(img, width, height, ratio) {
   var canvas, ctx, img64, orient;
  
   //获取图片方向
   orient = getPhotoOrientation(img);

   canvas = document.createElement('canvas');
   canvas.width = width;
   canvas.height = height;

   ctx = canvas.getContext("2d");

   //如果图片方向等于6 ,则旋转矫正,反之则不做处理
   if (orient == 6) {
      ctx.save();
      ctx.translate(width / 2, height / 2);
      ctx.rotate(90 * Math.PI / 180);
      ctx.drawImage(img, 0 - height / 2, 0 - width / 2, height, width);
      ctx.restore();
   } else {
      ctx.drawImage(img, 0, 0, width, height);
   }

   img64 = canvas.toDataURL("image/jpeg", ratio);
   return img64;
}

OK, 问题解决!

以上这篇JS解决IOS中拍照图片预览旋转90度BUG的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
给Function做的OOP扩展
May 07 Javascript
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
浅析return false的正确使用
Nov 04 Javascript
js动态移动滚动条至底部示例代码
Apr 24 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
原生js实现html手机端城市列表索引选择城市
Jun 24 Javascript
JavaScript 对象创建的3种方法
Nov 17 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 #Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 #Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 #Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 #Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 #Javascript
js数组实现权重概率分配
Sep 12 #Javascript
js 概率计算(简单版)
Sep 12 #Javascript
You might like
中国收音机工业发展史
2021/03/02 无线电
php 读取文件乱码问题
2010/02/20 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
常用简易JavaScript函数
2009/04/09 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
javascript实现简易计算器
2017/02/01 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Tesserocr库的正确安装方式
2018/10/19 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
新闻传播专业求职信
2014/07/22 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
工程项目合作意向书
2015/05/08 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
生日赠语
2015/06/23 职场文书
php将xml转化对象的实例详解
2021/11/17 PHP