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 相关文章推荐
filemanage功能中用到的common.js
Apr 08 Javascript
学习jquery必备 api中英文对照的chm手册 下载
May 03 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
JavaScript实现计数器基础方法
Oct 10 Javascript
Node.js 使用jade模板引擎的示例
May 11 Javascript
微信小程序获取用户openid的实现
Dec 24 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
Sep 21 Javascript
小程序接口的promise化的实现方法
Dec 11 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python实现类之间的方法互相调用
2018/04/29 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
如何高效率的查找一个月以内的数据
2012/04/15 面试题
工程项目建议书范文
2014/03/12 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
教师节祝酒词
2015/08/11 职场文书
导游带团欢迎词
2015/09/30 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
MySQL的安装与配置详细教程
2021/06/26 MySQL
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS