通过exif.js简单处理手机照片拍摄图片旋转问题
在移动端拍照获取图片后,然后使用canvas压缩图片,有时我们会发现输出的图片是旋转过的。
其实当我们旋转手机拍照的时候,就会产生一个角度问题,生成的图片都会有EXIF meta data。然后我们可以通过一个js插件[exif-js]来读取图片的EXIF meta data
中的角度数值,再通过canvas对图片进行旋转处理,这样我们就可以输出正常角度的图片了。
具体的EXIF meta data
可以参考如下:http://www.impulseadventure.com/photo/exif-orientation.html
下面就简单的介绍一下实现步骤,具体的代码参考这里:传送门
使用input file获取本地的图片
获取本地图片我们使用简单的input file
标签,然后在onchange
事件里获取图片的相关信息
<input type="file" accept="image/*" id="uploadImage" capture="camera" onchange="selectFileImage(this);"/>
通过input file
获取到图片file
对象,然后使用FileReader
对象获取到内容数据。
function selectFileImage (file){var imgFile = file.files[0];var oReader = new FileReader();oReader.onload = function (e) {console.log('图片信息', e.target.result);}oReader.readAsDataURL(imgFile);
}
使用exif-js获取到图片的旋转角度
这个就比较简单了,简单调用下接口就可以实现
EXIF.getData(imgFile, function () {var allTags = EXIF.getAllTags(this);var orientation = allTags.Orientation;
})
通过canvas转化压缩图片
根据实际情况判断自己需要的图片大小,然后进行缩放,最后通过toDataURL
方法转成base64格式
var image = new Image();
image.src = e.target.result;
image.onload = function () {var expectWidth = this.naturalWidth;var expectHeight = this.naturalHeight;var newWidth;var newHeight;if (expectWidth > expectHeight && expectWidth > 640) {newWidth = 640;newHeight = newWidth * expectHeight / expectWidth;} else if (expectHeight > expectWidth && expectHeight > 640) {newHeight = 640;newWidth = newHeight * expectWidth / expectHeight;} else {newWidth = expectWidth;newHeight = expectHeight;}var canvas = document.createElement("canvas");var ctx = canvas.getContext("2d");canvas.width = newWidth;canvas.height = newHeight;ctx.drawImage(this, 0, 0, newWidth, newHeight);// canvas.toDataURL('image/jpeg');
}
旋转图片
通过上述EXIF
获取到的旋转角度,我们再通过canvas把图片旋转到正确的角度
if (orientation != "" && orientation != 1) {switch (orientation) {case 6://需要顺时针(向左)90度旋转_this.rotateImg(this, '90', canvas, newWidth, newHeight);break;case 8://需要逆时针(向右)90度旋转_this.rotateImg(this, '270', canvas, newWidth, newHeight);break;case 3://需要180度旋转_this.rotateImg(this, '180', canvas, newWidth, newHeight);break;}
}function rotateImg (img, angle) {var width = img.width;var height = img.height;var ocanvas = document.createElement('canvas');var ctx = ocanvas.getContext("2d");var degree = angle * Math.PI / 180;switch (angle) {case '0':ocanvas.width = width;ocanvas.height = height;ctx.drawImage(img, 0, 0, width, height);break;case '90':ocanvas.width = height;ocanvas.height = width;ctx.rotate(degree);ctx.drawImage(img, 0, -height, width, height);break;case '180':ocanvas.width = width;ocanvas.height = height;ctx.rotate(degree);ctx.drawImage(img, -width, -height, width, height);break;case '270':ocanvas.width = height;ocanvas.height = width;ctx.rotate(degree);ctx.drawImage(img, -width, 0, width, height);break;}
}
总结一下
- 由于以上的方式获取到的图片都是base64格式,所以在读取信息上会有些缓慢,建议
EXIF.getData
公共获取图片信息后再对图片进行压缩处理,有能力的话可以使用Promise
处理 - 需要熟练使用canvas的API,当时在图片旋转的时候就多花了些时间理解
drawImage
通过exif.js简单处理手机照片拍摄图片旋转问题相关推荐
- exif.js解决ios手机上传照片后显示为旋转90度问题(兼容ios13.4之前的版本 )
exif.js解决ios手机上传照片后显示为旋转90度问题(兼容ios13.4 ) 问题描述: 在做手机移动端app时,发现iOS12.5.1版本(iphone6)上传照片出现顺时针旋转90问题,ip ...
- 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题
利用exif.js解决手机上传竖拍照片旋转90\180\270度问题 参考文章: (1)利用exif.js解决手机上传竖拍照片旋转90\180\270度问题 (2)https://www.cnblog ...
- 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- iphone照片删掉又出现_两个月前删的IPhone手机照片还有救?很简单,三招帮你轻松恢复...
照片是我们记录生活的一种方法,而且现在手机的拍照功能也越来越强大了,大家不用再耗费高额的费用去买相机,特别是iPhone的拍照功能可以说是很出色了,所以拍照一直爽一直爽,如果手机里的照片手滑不删掉了怎 ...
- 详解exif.js,应用于canvas照片倒转(海报H5)
业务背景,苹果手机调用上传接口拍照没有问题但是上传到网页上照片倒转了解决方法利用exif.js读取图片参数并对图片进行元数据修改 window.btoa(str)转码 window.atob(base ...
- 制作点击文字变颜色_手机照片、视频怎样添加文字?原来很简单,4种方法一分钟搞定...
手机照片.视频怎样添加文字?原来很简单,4种方法一分钟搞定 还有3天就到了元旦佳节,相信大家都很开心,美好的假期开始了. 那么可以说是你们元旦必备手机技巧,怎样给照片.视频添加文字,分享4种笔者常用的 ...
- 苹果手机怎么在照片上添加文字_手机照片如何添加文字?原来方法这么简单,花1分钟手把手教...
手机照片如何添加文字?原来方法这么简单,花1分钟手把手教 最近很多人私信笔者,手机拍摄的照片怎样添加好看的文字,今天笔者准备了4种方法,一起来看看吧! 1.自带水印功能(安卓手机) 一般人都是直接拍照 ...
- android手机照片恢复,安卓手机照片怎么恢复?简单恢复方法分享
安卓手机照片怎么恢复?手机作为中国微信用户强大的社交工具,可以说手机相机已成为人们生活的重要部分,不小心误删手机相册照片或者微信等图片,我们在使用手机过程中是不可避免的,别担心,小编有办法恢复的,下面 ...
- 日历签到html,简单的手机移动端日历签到js代码
特效详情: 一款简单的手机移动端日历签到js代码,挺不错的手机签到页面,可自定义已签到日期,连续几天签到代码. js代码 var isSign = false; var myday = new Arr ...
最新文章
- CPU的自动调度矩阵乘法
- 一般关于大宗商品的供需关系相关的数据网址有哪些?
- 进程环境详解(四)---getenv、putenv和setenv函数详解
- 获取cookie里面的值
- Day 3 in India
- mysql8支持myISAM_mysql8 参考手册--优化MyISAM表
- java吃豆人代码讲解_在吃豆人的这一关里,隐藏着来自程序员的深深恶意
- POJ-1050(DP)
- html如何隐藏盒子的边框线,用DIV和CSS做一个实线边框的红色盒子
- 算法设计与分析——排序算法:十大排序算法总结
- java ffmpeg amr转wav_FFmpeg转音频格式为wav
- Redis集群原理详解
- 银行c语言面试题,笔试题(商业银行方面)
- Oracle扩展redo
- oracle无效数字紧接着起line,shape数据类型【DOC精选】.doc
- python中difference_update_Python学习笔记-Python基础(二)
- 80个让你笑爆肚皮的程序员段子,不好笑算我输!
- html时区时间显示,JS显示多个国家时区当前时间代码
- window.onload与body.onload
- SAP PR采购申请的审批策略