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 相关文章推荐
javascript 面向对象编程 万物皆对象
Sep 17 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
js实现每日自动换一张图片的方法
May 04 Javascript
Javascript常用小技巧汇总
Jun 24 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
JS实现Select的option上下移动的方法
Mar 01 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
Sep 03 Javascript
vue组件间通信子与父详解(二)
Nov 07 Javascript
Node.js静态服务器的实现方法
Feb 28 Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 Javascript
JavaScript中的this基本问题实例小结
Mar 09 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
js实现批量删除功能
2020/08/27 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Django models.py应用实现过程详解
2019/07/29 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
Python包和模块的分发详细介绍
2020/06/19 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
制药工程专业应届生求职信
2013/09/24 职场文书
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
化妆品店促销方案
2014/02/24 职场文书
英文演讲稿
2014/05/15 职场文书
青年标兵事迹材料
2014/08/16 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
获奖感言怎么写
2015/07/31 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang