在移动端的页面需要做用户拍照上传的功能时会有用,苹果即使竖着拍照,上传到网页后它也会变成横的,好像IOS得一个BUG,安卓就没有这个问题。

要解决这个问题需要引入exif.js这个库,网上随便搜一下就有的下载。

//对图片旋转处理 added by lzk
function rotateImg(img, direction,canvas) {//alert(img);//最小与最大旋转方向,图片旋转4次后回到原方向var min_step = 0;var max_step = 3;//var img = document.getElementById(pid);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;}
}

/***旋转iphone拍照变横后的照片** @param {*} o 传入当前的input type=file,一般在change事件里传入this * @param {*} callback 回调函数,照片旋转后执行的事件* @returns*/
function rotatePhoto(o,callback){var file=o.files[0];var Orientation = null;if (file) {console.log("正在上传,请稍后...");var rFilter = /^(image\/jpeg|image\/png)$/i; // 检查图片格式if (!rFilter.test(file.type)) {//showMyTips("请选择jpeg、png格式的图片", false);return;}// var URL = URL || webkitURL;//获取照片方向角属性,用户旋转控制EXIF.getData(file, function() {// alert(EXIF.pretty(this));EXIF.getAllTags(this);//alert(EXIF.getTag(this, 'Orientation'));Orientation = EXIF.getTag(this, 'Orientation');//return;
        });var oReader = new FileReader();oReader.onload = function(e) {//var blob = URL.createObjectURL(file);//_compress(blob, file, basePath);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 u = navigator.userAgent;//修复iosif (u.match(/iphone/i)) {console.log('iphone');//如果方向角不为1,都需要进行旋转 added by lzkif(Orientation != "" && Orientation != 1){console.log('旋转处理');switch(Orientation){case 6://需要顺时针(向左)90度旋转console.log('需要顺时针(向左)90度旋转');rotateImg(this,'left',canvas);break;case 8://需要逆时针(向右)90度旋转console.log('需要逆时针(向右)90度旋转');rotateImg(this,'right',canvas);break;case 3://需要180度旋转console.log('需要180度旋转');rotateImg(this,'right',canvas);//转两次rotateImg(this,'right',canvas);break;}}//base64 在外定义为全局变量//下面base64为得到旋转后的base64图片base64 = canvas.toDataURL("image/jpeg", 0.8);var type = 'jpeg';var fixtype = function (type) {type = type.toLocaleLowerCase().replace(/jpg/i, 'jpeg');var r = type.match(/png|jpeg|bmp|gif/)[0];return 'image/' + r;};base64 = base64.replace(fixtype(type), 'image/jpeg');// saveFile(base64, '111')  此处是如果想要保存当前图片到本地的话;//这里是把已经旋转过的图片路径赋值到img中
                    callback(base64)}  else if (u.indexOf('Android') > -1 || u.indexOf('Adr') > -1) {//如果安卓收到ios拍摄的照片,可以按PC端方式判断
                    callback(e.target.result)}else{//修复PC端上上传ios拍出来的图片if(Orientation != "" && Orientation != 1){//alert('旋转处理');switch(Orientation){case 6://需要顺时针(向左)90度旋转console.log('需要顺时针(向左)90度旋转');rotateImg(this,'left',canvas);break;case 8://需要逆时针(向右)90度旋转console.log('需要逆时针(向右)90度旋转');rotateImg(this,'right',canvas);break;case 3://需要180度旋转console.log('需要180度旋转');rotateImg(this,'right',canvas);//转两次rotateImg(this,'right',canvas);break;}} base64 = canvas.toDataURL("image/jpeg", 0.8);var type = 'jpeg';var fixtype = function (type) {type = type.toLocaleLowerCase().replace(/jpg/i, 'jpeg');var r = type.match(/png|jpeg|bmp|gif/)[0];return 'image/' + r;};base64 = base64.replace(fixtype(type), 'image/jpeg');callback(base64)}};};oReader.readAsDataURL(file);}}

上面两个是基础函数,引入exif.js后,直接复制放进script标签里就行,下面的是调用方法:

document.getElementById('upload').addEventListener('change',function(){ //这里是你的上传按钮//这里定义一个函数,用来处理你原本上传完照片后的事情
var callback = function(src){    //这个src就是旋转后图片的base64地址//这里是上传旋转图片后,再插入文档进行预览,这里的事件根据实际需求编写var img = new Image()img.src = srcimg.onload = function(){$('.box).append(img)
}
}//这里就是旋转照片
rotatePhoto(this,callback)
})

转载于:https://www.cnblogs.com/haqiao/p/9386212.html

移动端 Iphone拍照变横问题的解决相关推荐

  1. 苹果home键在哪里设置_苹果手机添加水印在哪里设置 iphone拍照水印设置方法

    苹果手机添加水印在哪里设置 iphone拍照水印设置方法 很多果粉都羡慕安卓手机可以自动添加照片水印,能让自己的照片变得独一无二.iPhone手机因为iOS系统的封闭性并不能直接添加照片水印,很多人也 ...

  2. 苹果计划在明年推出的高端iPhone机型上应用挖孔屏

    近日,据国外媒体报道,苹果公司计划在明年推出的高端iPhone机型上应用挖孔屏. 此前,海外博主带来了最新的iPhone 14 Pro系列的概念渲染图,提前展示了该机的外观设计方案.图片显示,iPho ...

  3. mysql 竖列变成横行_mysql 横变竖 竖变横

    竖变横 创表 CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, ...

  4. python将横转为竖_【后端开发】python数据竖着怎么变横的?

    python现在是非常火热的语言,现在各行各业都有许多人在学习Python,但是在学习的过程中遇到的困难也不少.比如,下面我将说的,如何将数据由竖状变成横状. 第一种方法: 横状数据: def fun ...

  5. python如何横向输出_python数据竖着怎么变横的?

    python现在是非常火热的语言,现在各行各业都有许多人在学习Python,但是在学习的过程中遇到的困难也不少.比如,下面我将说的,如何将数据由竖状变成横状. 第一种方法: 横状数据:def func ...

  6. MySQL中的竖列变横列

    工作中经常会用到竖列变横列的情况,下面通过一个实例来说一下实现竖列变横列的几种方式: 创建数据库表: CREATE TABLE `student_score` ( `id` int(11) unsig ...

  7. 用html将竖的图片打横,【收藏】让竖版图片变横版不变形的两种方法

    朋友们大家好,我在学员群里常常会讲到两个字:大忌. 每当说到这两个字的时候,所指的情况大多是某个朋友做的PPT里的某张图片,因为被强行拉伸而导致变形. 确实,在ppt或其他的什么设计图中,图片变形乃是 ...

  8. html5 拍照 苹果手机黑屏,苹果手机拍照黑屏怎么办?iphone拍照黑屏的解决办法...

    很多用户在使用iPhone相机时都遇到过打开相机黑屏的情况,今天教大家遇到这种情况后的解决方法,一起了解一下! iphone拍照黑屏的解决办法 常常遇到的情况时点击QQ或者微信的相机按钮进入相机,如下 ...

  9. iPhone 拍照声音如何关闭?教你4招防止发出相机「咔嚓」声

    当我们举起 iPhone 手机拍照时候,都会发出默认的声音,「咔嚓」一下表明正在拍摄.有些人听到这声音会感觉正常,但是有些人却希望能够关掉. 如何关闭 iPhone 拍照声音 在 iPhone 手机的 ...

最新文章

  1. 字母组成美丽的图形 c语言,[原创]美丽蝴蝶
  2. 全球首个可繁殖活体机器人问世:AI参与设计,已自我繁殖4代
  3. 汇编和python-Python入门你要懂哪些?这篇文章总算讲清楚了
  4. 谷歌X实验室开源了一款像血糖仪一样的EEG识别系统
  5. POST方式发起下载请求
  6. 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...
  7. 火箭联盟服务器维护中怎么办,《火箭联盟》出现服务器问题 官方致歉并承诺会尽快修复...
  8. java讲对象放在常量池的方法_java的常量池里面都放了些神马东西
  9. 有了这些接口测试用例+工具,测试效率想不提升都难
  10. 模板设计在tomcat中的应用
  11. shell中的局部变量与全局变量
  12. 蒙提霍尔问题(三门问题)的思考与贝叶斯分析
  13. 小米4c怎么添加语言怎么设置在哪个文件夹,小米4C怎么加密图片?私密文件夹使用方法...
  14. 5V转1.8V稳压芯片,3.7V转1.8V稳压芯片
  15. 通达信破底翻形态选股公式,选出破底之后再翻回的标的
  16. spring定时任务@schedule
  17. IE浏览器提示安全证书过期怎么办
  18. Mac 上 git 命令出现 xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer direc 错误
  19. 【数据结构】二叉树 (Binary Tree)
  20. 今天才发现,手机外放声音小,这样设置一下,轻松增大手机音量

热门文章

  1. matlab中surf x,matlab中surf什么意思
  2. vivo显示android设备登录,android中的后台服务没有运行oppo,vivo等设备
  3. uniapp中touchstart、touchmove和touchend在H5中无法触发,可通过jQuery添相应事件代替
  4. 如何修改sql服务器名,修改SQL Server数据库服务器名字
  5. Linux基础: 挂载镜像文件(Mount ISO)
  6. 解读--狐狸和乌鸦的故事
  7. 二十七、GIL及网络编程相关知识
  8. mysql按照时间自动创建分区表_mysql 表分区、按时间函数分区、删除分区、自动添加表分区...
  9. 关于开淘宝虚拟充值网店问题
  10. html5水滴动画,纯css3水滴元素动画特效