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 相关文章推荐
新鲜出炉的js tips提示效果
Apr 03 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
JavaScript AJAX之惰性载入函数
Aug 27 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
Bootstrap选项卡学习笔记分享
Feb 13 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
在vue项目中引入highcharts图表的方法(详解)
Mar 05 Javascript
JavaScript中Array方法你该知道的正确打开方法
Sep 11 Javascript
JS 5种遍历对象的方式
Jun 16 Javascript
vue-cli脚手架的.babelrc文件用法说明
Sep 11 Javascript
vue如何实现关闭对话框后刷新列表
Apr 08 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表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
php-app开发接口加密详解
2018/04/18 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
jQuery实现日历效果
2020/09/11 jQuery
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
Python批量更改文件名的实现方法
2017/10/29 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python web基础之加载静态文件实例
2018/03/20 Python
Django 使用logging打印日志的实例
2018/04/28 Python
Python画图高斯分布的示例
2019/07/10 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
给老师的检讨书
2014/02/11 职场文书
楼面经理岗位职责范本
2014/02/18 职场文书
财务负责人任命书
2014/06/06 职场文书
解除租房协议书
2014/12/03 职场文书