背景

input标签调起ios原生摄像头拍照时,上传照片发现照片向左旋转了90度

旋转的原因:

手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下:

用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正。

1代表正常的拍摄角度,ios横屏下拍摄、安卓机无论横屏竖屏拍摄,Orientaion的值都为1;但是ios竖屏拍摄,Orientaion的值为6,即竖着拍出的照片被添加了一个顺时针旋转90°的拍照方向,显示的时候其实就是横着拍的照片顺时针旋转90°而成。当我们对拍出来的照片进行处理后(比如压缩),这个拍摄方向Orientaion信息就会丢失,显示的效果自然回到横屏状态,看起来像是逆时针旋转了90°

受之于鱼不如授之于渔 我提出三种解决思路

第一种解决思路:

1、利用exif-js获取file拍摄方向信息Orientation
2、创建canvas,ctx = canvas.getContext(‘2d’);
3、根据Orientation,经过ctx.rotate(旋转)、 ctx.drawImage(手动绘图)
4、canvas.toBlob 创建文件流,再传给服务端

这也是网上的大神通用的解决办法

  • 缺点(推荐指数:3星)

    • 很多人卡在了第一步,获取到的Orientation=undefined; 首先获取图片信息只对拍摄方式的照片生效,不要在本地上传图片进行调试;其次获取Orientation时,要在回调函数内获取,如下代码
    • 需要熟悉canvas知识
    • 第三部rotate、drawImage方法如果没有掌握的很好,最后的绘图步骤会让你抓狂
    • 第四部创建的文件流会超级大,需要很久的上传时长,尽管可以控制转换质量使之变小,但也会大大失桢
 // 只对即时拍摄的照片生效,file为文件流,非base64ExifObj.getData(file, function () {const Orientation = ExifObj.getTag(file, 'Orientation');// 在这里获取});// 不要在这里获取
第二种解决思路:

如果没有特殊要求,请不要对图片进行二次处理,例如进行压缩,最简单快捷地解决问题;

第三种解决思路:(推荐指数:5星)

思路:既然经处理后的图片方向信息丢失,那我们可以手动再次添加方向不就解决问题了嘛

  • 如果图片必须经过处理,在处理前请先利用exif-js缓存照片方向信息
  • 处理后利用piexif手动对处理后的文件添加方向信息
  • 最后向服务器发送文件流或base64信息-保存
  • 缺点:最后添加的方向信息可能会使图片的size增加,但完全规避了方法一繁琐的步骤及开发成本
npm i exif-js
npm i piexif
...
import React, { useState, useEffect, FC } from 'react';
import Exif from 'exif-js';
import * as piexif from 'piexif';
import { IExif, IExifElement, TagValues } from 'piexif';interface IProps {history: any; // TS内容 可不写
}
const AppView: FC<IProps> = props => {const ExifObj = Exif;const Piexif = piexif;const [orientation, setOrientation] = useState<number>(1); // 初始化方向useEffect(() => {ExifObj.getData(file, function () {setOrientation(ExifObj.getTag(file, 'Orientation')); // 先获取方向信息file为文件流// ——————————————————————————// 这里是图片文件处理过程,省略1w行代码...// ——————————————————————————// 开始利用piexif写图片方向信息let zeroth: IExifElement = {};zeroth[TagValues.ImageIFD.Orientation] = orientation;let exifObj: IExif = { '0th': zeroth }; // 重新写方向let exifStr = Piexif.dump(exifObj); //获取需要写信息的合法字符串格式let resultBase64 = Piexif.insert(exifStr, file); //将exif信息插入到base64中,此时的file为处理后的文件流,非base64,服务端如果需要base64格式则直接上传即可// 若服务器需要文件流格式(blob),仍需要转化为blobconst blobfilr = base64ToBlob(resultBase64);  // 发送ajax  });}, [])const base64ToBlob = base64 => {const parts = base64.split(';base64,');const contentType = parts[0].split(':')[1];const raw = window.atob(parts[1]);const rawLength = raw.length;const uInt8Array = new Uint8Array(rawLength);for (let i = 0; i < rawLength; i += 1) {uInt8Array[i] = raw.charCodeAt(i);}return new Blob([uInt8Array], { type: contentType });};}

如果真的解决了你的问题或对你有启发,回来点个赞吧

参考文献:
【npm官网】https://www.npmjs.com/package/piexif
【前端开发仓库】http://code.ciaoca.com/javascript/exif-js/
【zoukankan】http://t.zoukankan.com/ranyonsue-p-10830688.html

input调起ios摄像头拍照旋转问题解决思路相关推荐

  1. 001 摄像头拍照+旋转+截取部分+计算棋盘的四个角点坐标+四点定位拉伸

    001 摄像头拍照+旋转+截取部分+计算棋盘的四个角点坐标+四点定位拉伸 这样,顶上的摄像头即便稍有一些移位或歪斜,也不影响了. 最终得到的是棋盘的规范图,为后续识别做好了准备. # -*- codi ...

  2. vue用input调起手机摄像头录制视频

    <input ref="inputVideo" type="file" name="video" id="video-inp ...

  3. ios html5 拍照旋转,H5 解决ios拍照旋转90度

    var img_photo=''; function selectFileImage(fileObj) { var formdata = new FormData(); var file = file ...

  4. iOS中屏幕旋转问题解决

    https://blog.csdn.net/black_house/article/details/42460127 竖屏点击按钮 旋转到横屏 [[UIDevice currentDevice] se ...

  5. 前置摄像头 镜像_iPhone 前置摄像头拍照左右相反?试试 iOS 13 的照片编辑功能...

    喜欢使用 iPhone 拍照的小伙伴会发现,当使用前置摄像头自拍时,得到的照片左右似乎时相反的.这是因为,当你打开 iPhone 相机应用,调到前置摄像头开始拍照时,界面中显示的是镜像画面,就跟你平时 ...

  6. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式

    PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video) <template><div><!--开启摄像头 ...

  7. ios 图片逆时针旋转_iphone-IOS 竖直拍照被旋转,image-orientation 让图片自动旋转

    本文目录结构 IOS 垂直拍照的时候会遇到,PC 端读取的时候,逆时针旋转了 90 度的问题: 安卓.PS 处理的,相册选择截图等不会出现这个问题: 场景说明: 这个图片在浏览器里,如果您单独打开的时 ...

  8. iPhone摄像头拍照后图像旋转

    最近做了个有关图像处理的APP,里面涉及到拍照和从相册读图,测试时发现一个神奇的问题. 当我用后置摄像头拍照,然后将拍摄到的图片显示在APP界面上时,图片一切正常,然后读取图片像素信息,再用像素信息生 ...

  9. android 三星调用拍照功能吗,Android 开发手机(三星)拍照应用照片旋转问题解决办法...

    Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok ...

最新文章

  1. FGMap学习之--加载百度地图
  2. 任务调度(三)——Timer的替代品ScheduledExecutorService简介
  3. 监督学习 | 线性回归 之正则线性模型原理及Sklearn实现
  4. linux系统切换清华源(自带的源下载速度太拉跨)
  5. hadoop搭建部署
  6. Django REST framework 渲染器、版本
  7. 关于Excel导入SQLServer的说明
  8. Java 注解Annotation总结二
  9. 04 - 雷达的工作频率
  10. ssh 远程锁住解锁_Linux 中锁定和解锁用户帐户的三种方法
  11. PS 渐变工具(锥形【线性渐变】和圆形【径向渐变】)
  12. 《计算机网络教程》(微课版 第五版)第七章 网络安全 课后习题及答案
  13. Tesla T4 在Ubuntu18.04上的安装使用
  14. python程序随机画30个星星_Python3图形(绘制星星)
  15. 民办大学计算机专业教师,考生被民办大学录取,看到高昂学费想放弃,老师坦言这个专业值得...
  16. 华为od机考题目-幼儿园找出同班的小朋友(幼儿园分班)
  17. 【手把手教你】使用Logistic回归、LDA和QDA模型预测指数涨跌
  18. 合合信息IPO的喜和忧:B+C战略并行,多业务线亏损,近三年专利增长率为负值
  19. 国有企业不能有信息化
  20. 百度启用新顶级域名baidu.news

热门文章

  1. NVIDIA显卡,显卡驱动和CUDA版本之间的关系
  2. connection activation faild
  3. 从Dinic到ISAP,从余流推进到最高标号的预留推进HLPP(究极最大流算法)
  4. 运维面试题(每日一题)
  5. 死亡搁浅运送系统服务器,死亡搁浅图文攻略 主线流程+订单系统+运送流程+建筑搭建 操作介绍-游侠网...
  6. LRU 不知道?这个生活实例一定知道吧!
  7. Web——P2P应用
  8. js通过对象通过value找key
  9. yjk的波库在哪里_PKPM、YJK地震波导入至MIDAS软件中的方法
  10. bzoj4864: [BeiJing 2017 Wc]神秘物质