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 相关文章推荐
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
Eclipse引入jquery报错如何解决
Dec 01 Javascript
JavaScript类的写法
Sep 17 Javascript
Vue.extend构造器的详解
Jul 17 Javascript
如何在vue中使用ts的示例代码
Feb 28 Javascript
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 Javascript
JS遍历树层级关系实现原理解析
Aug 31 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
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
SONY ICF-SW55的电路分析
2021/03/02 无线电
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python的净值数据接口调用示例分享
2016/03/15 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
Django websocket原理及功能实现代码
2020/11/14 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
应届毕业生求职信范文分享
2013/12/26 职场文书
机修工工作职责
2014/02/21 职场文书
自荐信的格式
2014/03/10 职场文书
保护环境演讲稿
2014/05/10 职场文书
实施意见格式范本
2015/06/05 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python