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 相关文章推荐
ie8模式下click无反应点击option无反应的解决方法
Oct 11 Javascript
jQuery实现单击和鼠标感应事件
Feb 01 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
详细谈谈javascript的对象
Jul 31 Javascript
node-sass安装失败的原因与解决方法
Sep 04 Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 Javascript
mpvue写一个CPASS小程序的示例
Sep 04 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
bootstrap-table+treegrid实现树形表格
Jul 26 Javascript
javascript实现支付宝滑块验证码效果
Jul 24 Javascript
Vue组件更新数据v-model不生效的解决
Apr 02 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
php读取纯真ip数据库使用示例
2014/01/26 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
PHP 微信支付类 demo
2015/11/30 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
python实现rsa加密实例详解
2017/07/19 Python
python实现手机通讯录搜索功能
2018/02/22 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python实现简单http服务器
2018/04/12 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
《寓言两则》教学反思
2014/02/27 职场文书
车间安全生产标语
2014/06/06 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python