在移动端拍照获取图片后,然后使用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简单处理手机照片拍摄图片旋转问题相关推荐

  1. exif.js解决ios手机上传照片后显示为旋转90度问题(兼容ios13.4之前的版本 )

    exif.js解决ios手机上传照片后显示为旋转90度问题(兼容ios13.4 ) 问题描述: 在做手机移动端app时,发现iOS12.5.1版本(iphone6)上传照片出现顺时针旋转90问题,ip ...

  2. 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题

    利用exif.js解决手机上传竖拍照片旋转90\180\270度问题 参考文章: (1)利用exif.js解决手机上传竖拍照片旋转90\180\270度问题 (2)https://www.cnblog ...

  3. 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  4. iphone照片删掉又出现_两个月前删的IPhone手机照片还有救?很简单,三招帮你轻松恢复...

    照片是我们记录生活的一种方法,而且现在手机的拍照功能也越来越强大了,大家不用再耗费高额的费用去买相机,特别是iPhone的拍照功能可以说是很出色了,所以拍照一直爽一直爽,如果手机里的照片手滑不删掉了怎 ...

  5. 详解exif.js,应用于canvas照片倒转(海报H5)

    业务背景,苹果手机调用上传接口拍照没有问题但是上传到网页上照片倒转了解决方法利用exif.js读取图片参数并对图片进行元数据修改 window.btoa(str)转码 window.atob(base ...

  6. 制作点击文字变颜色_手机照片、视频怎样添加文字?原来很简单,4种方法一分钟搞定...

    手机照片.视频怎样添加文字?原来很简单,4种方法一分钟搞定 还有3天就到了元旦佳节,相信大家都很开心,美好的假期开始了. 那么可以说是你们元旦必备手机技巧,怎样给照片.视频添加文字,分享4种笔者常用的 ...

  7. 苹果手机怎么在照片上添加文字_手机照片如何添加文字?原来方法这么简单,花1分钟手把手教...

    手机照片如何添加文字?原来方法这么简单,花1分钟手把手教 最近很多人私信笔者,手机拍摄的照片怎样添加好看的文字,今天笔者准备了4种方法,一起来看看吧! 1.自带水印功能(安卓手机) 一般人都是直接拍照 ...

  8. android手机照片恢复,安卓手机照片怎么恢复?简单恢复方法分享

    安卓手机照片怎么恢复?手机作为中国微信用户强大的社交工具,可以说手机相机已成为人们生活的重要部分,不小心误删手机相册照片或者微信等图片,我们在使用手机过程中是不可避免的,别担心,小编有办法恢复的,下面 ...

  9. 日历签到html,简单的手机移动端日历签到js代码

    特效详情: 一款简单的手机移动端日历签到js代码,挺不错的手机签到页面,可自定义已签到日期,连续几天签到代码. js代码 var isSign = false; var myday = new Arr ...

最新文章

  1. CPU的自动调度矩阵乘法
  2. 一般关于大宗商品的供需关系相关的数据网址有哪些?
  3. 进程环境详解(四)---getenv、putenv和setenv函数详解
  4. 获取cookie里面的值
  5. Day 3 in India
  6. mysql8支持myISAM_mysql8 参考手册--优化MyISAM表
  7. java吃豆人代码讲解_在吃豆人的这一关里,隐藏着来自程序员的深深恶意
  8. POJ-1050(DP)
  9. html如何隐藏盒子的边框线,用DIV和CSS做一个实线边框的红色盒子
  10. 算法设计与分析——排序算法:十大排序算法总结
  11. java ffmpeg amr转wav_FFmpeg转音频格式为wav
  12. Redis集群原理详解
  13. 银行c语言面试题,笔试题(商业银行方面)
  14. Oracle扩展redo
  15. oracle无效数字紧接着起line,shape数据类型【DOC精选】.doc
  16. python中difference_update_Python学习笔记-Python基础(二)
  17. 80个让你笑爆肚皮的程序员段子,不好笑算我输!
  18. html时区时间显示,JS显示多个国家时区当前时间代码
  19. window.onload与body.onload
  20. SAP PR采购申请的审批策略

热门文章

  1. 如何使用Node.js来制作电子音乐-和弦
  2. 抖音2018大数据分析报告
  3. python注释多行
  4. 推荐一篇微服务硬核文章 6 张图带你搞懂微服务
  5. 虚拟机配置DNS服务器
  6. 第0讲:树莓派是什么?能做什么?
  7. Oracle-基本SQL语句
  8. 输了腾讯赢了阿里:凭借27天超强度复习Java核心知识+面试神技,三面阿里斩获P6岗offer(飞猪事业部)
  9. python读取txt提取信息
  10. 程序员需要了解的硬核知识之控制硬件