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 相关文章推荐
基于jquery的无缝循环新闻列表插件
Mar 07 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
JavaScript学习笔记之JS对象
Jan 22 Javascript
angularJS 中input示例分享
Feb 09 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
详谈js的变量提升以及使用方法
Oct 06 Javascript
微信上传视频文件提示(推荐)
Nov 22 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
如何解决vue在ios微信"复制链接"功能问题
Mar 26 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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
php实现倒计时效果
2015/12/19 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php二维码生成以及下载实现
2017/09/28 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
Vue 修改网站图标的方法
2020/12/31 Vue.js
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
对python生成业务报表的实例详解
2019/02/03 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
Python 使用type来定义类的实现
2019/11/19 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
有机童装:Toby Tiger
2018/05/23 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
户外活动总结
2015/02/04 职场文书
2015年依法行政工作总结
2015/04/29 职场文书