IOS 上传图片方向显示错误问题

问题描述

在使用苹果手机上传图片的时候,发现传完的图片显示出来方向是错误的,竖着的图片会变成横着显示(少部分安卓手机也存在这个问题)

产生原因

ios 相机加入了方向传感器,它可以记录拍摄时的方向,并且记录在 exif 当中,所以这个时候竖拍的照片显示出来就会就会‘横’着了

解决办法

  1. 获取图片的 Orientation 信息,也就是拍摄方向
  2. 绘制一个 canvas, 将该图片绘制上去,然后修正显示方向
  3. 将 canvas 转化成我们需要的格式

具体操作:

const reader = new FileReader();

reader.onload = function() {
const result = this.result;
const photoImg = new Image(); photoImg.src = result; photoImg.onload = function() {
// 生成canvas
const canvas = document.createElement('canvas');
const width = photoImg.width;
const height = photoImg.height; canvas.height = width;
canvas.width = height;
const ctx = canvas.getContext('2d');
EXIF.getData(photoImg, function() {
// 获取 Orientation 信息
const Orientation = EXIF.getTag(this, 'Orientation');
// 根据 Orientation 信息修正方向
switch (Orientation) {
case 6:
ctx.rotate(Math.PI / 2);
ctx.translate(0, -height);
break;
case 3:
ctx.rotate(Math.PI);
ctx.translate(-width, -height);
break;
case 8:
ctx.rotate(-Math.PI / 2);
ctx.translate(-height, 0);
break;
default:
break;
}
// 将方向错误的图片绘制到 canvas 上
ctx.drawImage(photoImg, 0, 0);
// 将方向修正后的 canvas 装化成 base64 编码
const newImg = canvas.toDataURL('image/jpeg'); message.hide();
resolve(newImg);
});
};
};
reader.readAsDataURL(photo);

Orientation 参数对照

资料

exif 文档

ios上传图片显示方向错误问题的更多相关文章

  1. [iOS]关于视频方向的若干问题

    版本: OS X 10.10.5 Xcode 6.4(6E35b) iOS >= 7  一.MOV/MP4视频文件中的Rotation元数据 iOS上内置相机应用录制的mov/mp4视频可能产生 ...

  2. dedecms织梦网站图片集上传图片出现302错误图片提示怎么解决 已测

    时间:2016-01-20 来源:未知 作者:模板之家 阅读:次 小编今天上传织梦网站模板的时候,在图片集里面选择上传图片的时候,弹出302错误提示,当是真的是郁闷了,试了好几次,开始还以为是图片过大 ...

  3. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  4. ASP.NET Core中显示自定义错误页面

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  5. MVC中使用jquery uploadify上传图片报302错误

    使用jquery uploadify上传图片报302错误研究了半天,发现我上传的action中有根据session判断用户是否登录,如果没有登录就跳到登陆页,所以就出现了302跳转错误.原来更新了fl ...

  6. LCD显示方向

    一.ILI9341内存到显示地址的映射 本文只讨论“正常显示”,不讨论“垂直滚动显示”模式. 可以看到物理内存被两个指针访问,行指针和列指针,行指针范围从000h到013Fh,列指针范围为0000h到 ...

  7. 造成win2008 500内部错误不能显示详细错误的原因和解决方法

    造成500错误常见原因有:ASP语法出错.ACCESS数据库连接语句出错.文件引用与包含路径出错.使用了服务器不支持的组件如FSO等. 另外,对于win2008的IIS默认不显示详细出错信息的问题以下 ...

  8. 关于Android4.x系统默认显示方向各种修改

    1.设置属性值 在device.mk文件中加入PRODUCT_PROPERTY_OVERRIDES += \ ro.sf.hwrotation=180 2.设置屏幕默认显示方向 在frameworks ...

  9. 转:PHP - .htaccess设置显示PHP错误

    使用.htaccess可以在某种程度上更改PHP的错误显示的设置,实际上,相当于更改PHP.ini的参数,很是方便. 将以下相应代码放到对应目录中的.htaccess文件,即可实现相应功能. 关闭错误 ...

随机推荐

  1. urllib,url中链接包含汉字怎么用百分号(%)加密处理

    使用urllib中的quote,和unquote方法将汉字编码成gbk(2个百分号对应一个汉字)或者utf8(3个百分号对应一个汉字) 注意用%加密汉字时,汉字不能是Unicode编码格式,否则会报错 ...

  2. C# 集合之Dictionary详解

    开讲. 我们知道Dictionary的最大特点就是可以通过任意类型的key寻找值.而且是通过索引,速度极快. 该特点主要意义:数组能通过索引快速寻址,其他的集合基本都是以此为基础进行扩展而已. 但其索 ...

  3. HTML5 + JS 调取摄像头拍照下载

    <video id="video" width="640" height="480" autoplay></video&g ...

  4. 通过py2exe打包python程序的过程中,解决的一系列问题

    py2exe的使用方法参考<py2exe使用方法>. 注:程序可以在解释器中正常运行,一切问题都出在打包过程中. 问题1: 现象:RuntimeError: maximum recursi ...

  5. 从C到C++ (1)

    从C到C++ 一. bool类型 bool取值false和true,是0和1的区别: false可以代表0,但true有很多种,并非只有1. 二. const限定符 常量在定义后就不能修改,所以定义时 ...

  6. 【问题记录】Linux Python等交互式输入回退键出现 ^H^H

    执行:yum install readline readline-devel

  7. React开发时候注意点

    JSX 使用jsx的使用,用一个{}包裹起来,例如 const method = {<div> 123 </div>} 使用()小括号,防止分号自动插入 const eleme ...

  8. Qt 实现脉搏检测-2,简陋的功能产品

    今天终于可以接上硬件来显示真是的脉搏情况了,上图 主要就是显示脉搏的心跳曲线,和IBI 数据来源是三个,串口,网口和蓝牙,目前只实现了串口,过程应该都是差不多的,监听,读取,解析,等硬件更新后,再次更 ...

  9. Qt 使用irrlicht(鬼火)3D引擎

    项目中需要加载简单的3D场景.资深老前辈推荐使用开源小巧的引擎irrlicht. 关于irrlicht,来之百度百科 Irrlicht引擎是一个用C++书写的高性能实时的3D引擎,可以应用于C++程序 ...

  10. selenium 的安装使用

    直接pip安装 pip install selenium 默认是火狐浏览器,需要安装下面网址的软件,解压后加入到环境变量中就可以了 https://github.com/mozilla/geckodr ...