前言

记得16年的时候我初入前端差不多一年,公司做了一个webapp,有上传头像功能,当时这个项目不是我在负责,测试的时候发现苹果用户拍照上传头像会翻转,当时几个前端的同学捯饬了一下午也没解决,结果问题转到我这里,还有半个小时下班;当时也是一脸懵逼,首先想到的是,这怎么判断它是否翻转了呢?安卓没问题啊,有些苹果手机相册里面的图片也没问题啊,js能有这种功能判断吗?上网查资料,果不其然,有!那就是exfe.js,继续研究,此时组长姐姐已经买好晚餐,老板也来慰问,最后弄到晚上9点多,算是解决了。

时隔两年,昨天又遇到这个问题,已经离开上家公司一年半了,现公司做一个万圣节活动,里面也是上传图片,合成鬼脸图,早早两天前已经做好发给项目经理(我们这边是远程,少许几个开发者),晚上快下班时,项目经理发消息“ios图片翻转,解决一下,今晚要上线,加个班”,心里一万个草泥马奔腾而过,1是我忘了ios有这个问题,2是已经发给你2天了,你快下班的时候跟我说有问题,加个班!我晚上安排要推掉!还是无偿!没有慰问餐,也没有歉意,还是很好意思的加个班,还是苦笑一声回复,“好吧,下次提前测一下”,这回毕竟遇见过,处理起来比较快,7点多搞定。后续又有什么部署的问题,不是我的问题了,又是快9点了。

只是几乎类似的场景,感慨一下。

上代码

html部分

<input type="file" accept="image/*" id="uploadImage" capture="camera" onchange="selectFileImage(this);" />
<img alt="preview" src="" id="myImage"/>

exfe.js来读取图片信息,我们上传的图片里面是有很多信息的

//获取照片方向角属性,用户旋转控制
EXIF.getData(file, function() {EXIF.getAllTags(this);Orientation = EXIF.getTag(this, 'Orientation');console.log(Orientation);
});

Orientation的值有1,3,6,8之类的,分别代表0°,180°,顺时针90°,逆时针90°

当我们知道了图片的旋转角度,我们就可以用canvas来处理他们了,最后得到我们想要的结果,这里摘抄了网上一段代码,如果有特殊功能,那就要自己写一些逻辑了,也就是判断角度,判断操作系统,然后用canvas重新绘制,生成base64,最后对dom的操作,显示图片。

上代码

function selectFileImage(fileObj) {var file = fileObj.files['0'];//图片方向角 var Orientation = null;if (file) {//获取照片方向角属性,用户旋转控制EXIF.getData(file, function() {EXIF.getAllTags(this);Orientation = EXIF.getTag(this, 'Orientation');console.log(Orientation)});var oReader = new FileReader();oReader.onload = function(e) {var image = new Image();image.src = e.target.result;image.onload = function() {var expectWidth = this.naturalWidth;var expectHeight = this.naturalHeight;if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {expectWidth = 800;expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;} else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {expectHeight = 1200;expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;}var canvas = document.createElement("canvas");var ctx = canvas.getContext("2d");canvas.width = expectWidth;canvas.height = expectHeight;ctx.drawImage(this, 0, 0, expectWidth, expectHeight);var base64 = null;//修复iosif (navigator.userAgent.match(/iphone/i)) {console.log('iphone');//如果方向角不为1,都需要进行旋转 if(Orientation != "" && Orientation != 1){alert('旋转处理');switch(Orientation){case 6://需要顺时针(向左)90度旋转rotateImg(this,'left',canvas);break;case 8://需要逆时针(向右)90度旋转rotateImg(this,'right',canvas);break;case 3://需要180度旋转rotateImg(this,'right',canvas);//转两次rotateImg(this,'right',canvas);break;}}base64 = canvas.toDataURL("image/jpeg", 1);}else if (navigator.userAgent.match(/Android/i)) {// 修复androidvar encoder = new JPEGEncoder();base64 = encoder.encode(ctx.getImageData(0, 0, expectWidth, expectHeight), 80);}else{if(Orientation != "" && Orientation != 1){switch(Orientation){case 6://需要顺时针(向左)90度旋转rotateImg(this,'left',canvas);break;case 8://需要逆时针(向右)90度旋转rotateImg(this,'right',canvas);break;case 3://需要180度旋转rotateImg(this,'right',canvas);//转两次rotateImg(this,'right',canvas);break;}}base64 = canvas.toDataURL("image/jpeg", 1);}$("#myImage").attr("src", base64);};};oReader.readAsDataURL(file);}}//对图片旋转处理 function rotateImg(img, direction,canvas) {//最小与最大旋转方向,图片旋转4次后回到原方向var min_step = 0;var max_step = 3;if (img == null)return;//img的高度和宽度不能在img元素隐藏后获取,否则会出错var height = img.height;var width = img.width;//var step = img.getAttribute('step');var step = 2;if (step == null) {step = min_step;}if (direction == 'right') {step++;//旋转到原位置,即超过最大值step > max_step && (step = min_step);} else {step--;step < min_step && (step = max_step);}//旋转角度以弧度值为参数var degree = step * 90 * Math.PI / 180;var ctx = canvas.getContext('2d');switch (step) {case 0:canvas.width = width;canvas.height = height;ctx.drawImage(img, 0, 0);break;case 1:canvas.width = height;canvas.height = width;ctx.rotate(degree);ctx.drawImage(img, 0, -height);break;case 2:canvas.width = width;canvas.height = height;ctx.rotate(degree);ctx.drawImage(img, -width, -height);break;case 3:canvas.width = height;canvas.height = width;ctx.rotate(degree);ctx.drawImage(img, -width, 0);break;}}

用exfe.js和canvas解决移动端 IOS 拍照上传图片翻转问题相关推荐

  1. vue.js 使用 fastclick解决移动端click事件300毫秒延迟方法

    一般情况下一些框架就自动解决了这个问题 一.使用npm安装: npm install fastclick -S 二.用法: 安装完以后,可以在在main.js中全局引入,并绑定到body,全局生效.或 ...

  2. 修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题

    原文地址:https://www.cnblogs.com/jying/p/9642445.html,转载请说明出处. 最近项目需要播放视频且限制未观看部分的快进功能,找了两款js插件ckplayer和 ...

  3. Android11键盘弹出动画,(2016-11-04完美解决)移动端iOS第三方输入法遮挡底部input及android键盘回落后留白问题...

    问题概述 问题1:H5 web 移动端 输入框, 键盘唤起后fixed定位好的元素跟随页面滚动了起来- fixed属性失效了!满屏任性横飞, 如下图: 问题2:有几后来含些在到气时按式近篇来又的方浏消 ...

  4. html5 canvas 画图移动端出现锯齿毛边的解决方法

    html5 canvas 画图移动端出现锯齿毛边的解决方法 参考文章: (1)html5 canvas 画图移动端出现锯齿毛边的解决方法 (2)https://www.cnblogs.com/dear ...

  5. fastclick.js解决移动端(ipad)点击事件反应慢问题

    fastclick.js解决移动端(ipad)点击事件反应慢问题 参考文章: (1)fastclick.js解决移动端(ipad)点击事件反应慢问题 (2)https://www.cnblogs.co ...

  6. canvas 画图移动端出现锯齿毛边的解决方法

    最近项目中用的canvas 越来越多,但是之前都是在canvas 上画图片, 最近这次是做一个折线图,自己画出来以后发现有锯齿,百度一番后找到了解决办法,记录到博客里. 声明一下,我用的是第二种方法, ...

  7. flexible.js+rem解决pc端适配

    第一步:新建 flexible.js文件 这里默认是10等份,手动改为24,此时1rem=1920/24px即80px.(设计稿是1920px的) (function flexible(window, ...

  8. 前端vue js 高德地图实现雷达扫描加载,借鉴百度地图等方法,采用Canvas解决雷达背景透明度问题,解决Canvas动态指针扫描造成浏览器卡顿问题

    前端vue js 高德地图实现雷达扫描加载,借鉴百度地图等方法,采用Canvas解决雷达背景透明度问题,解决Canvas动态指针扫描造成浏览器卡顿问题 经过3天的尝试,借鉴了好几个博客的思路,开发了一 ...

  9. html百度转到顶部 fixed,科技常识:完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题...

    今天小编跟大家讲解下有关完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题 的相关资料 ...

最新文章

  1. 找规律 百度之星资格赛 1001 大搬家
  2. 记录解决二次编码问题
  3. Linux android studio :'tools.jar' seems to be not in Android Studio classpath.
  4. 洛谷P1434-滑雪【线性化Dp】
  5. 使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。
  6. SSH整合(1)异常
  7. .NET Core 2.1 Preview 2带来网络方面的改进
  8. sketchup 255个su常用插件)_[插件课堂] SU.KIT发布了v2020,完美支持SketchUp 2020
  9. Atitit algo art算法的艺术 attilax 著 va v67.docxAtitit 算法的艺术 attilax 1. 模型 文本 音视频 图像 32. 文本方面的编码算法 3
  10. Scala语言精华版笔记整理
  11. 学历学籍管理系统-MVC和工厂模式实现学籍查询与录入
  12. python微信朋友圈分享功能_利用Python让你的微信朋友圈与众不同,更加高大上
  13. 为Linux草根队加油
  14. z390 m.2 接口插上sata 硬盘后,机械硬盘不识别;HDD 硬盘不识别;z390 m.2和 SATA 硬盘安装组合;
  15. 拼多多搜索词统计 API接口操作展示说明
  16. IPv4和IPv6的相互转换
  17. 微阵列芯片服务器,功能性分群于微阵列芯片之应用
  18. 干货推荐|Java并发编程核心概念一览,面试必备!
  19. 如何提高职场说服力?这本说服力书籍你值得拥有!
  20. iOS开发——项目篇—高仿百思不得姐

热门文章

  1. 企业为什么要开通银企直联_企业账务的福音,竟然只有1%的人知道!|1分钟带你了解银企直联...
  2. React兄弟组件间传参
  3. 多场景应用,网易视频云拉开网络直播新竞争
  4. Cadence添加工艺库 | 虚拟机与宿主机共享文件
  5. 全球与中国医院床垫市场深度研究分析报告
  6. Java实现在小程序获取用户手机号码的功能
  7. URL Schemes入门指南
  8. uefi启动linux过程_UEFI的两种启动模式
  9. FileInputStream、FileDescriptor源码学习
  10. ar8161网卡 linux,Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉问题解决