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将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
JS倒计时实例_天时分秒
Aug 22 Javascript
Javascript防止图片拉伸的自适应处理方法
Dec 26 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
微信小程序传值以及获取值方法的详解
Apr 29 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
Vue filter 过滤器、以及在table中的使用介绍
Sep 07 Javascript
vue二选一tab栏切换新做法实现
Jan 19 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
建立动态的WML站点(一)
2006/10/09 PHP
解析PHP的session过期设置
2013/06/29 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
了解VUE的render函数的使用
2017/06/08 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python使用PyQt5的简单方法
2019/02/27 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python连接Impala实现步骤解析
2020/08/04 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
Java基础面试题
2014/07/19 面试题
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
建筑学专业自荐书
2014/07/09 职场文书
售后服务质量承诺书
2015/04/29 职场文书
消防宣传标语大全
2015/08/03 职场文书
安全生产会议制度
2015/08/06 职场文书