iOS手机竖着拍的照片被旋转了90°的原因以及解决方案

EXIF.getData(IMG_FILE, function () { // IMG_FILE为图像数据

var orientation = EXIF.getTag(this, “Orientation”);

console.log(“Orientation:” + orientation); // 拍照方向

});

获取拍照方向的结果为1-8的数字:

在这里插入图片描述

注意:对于上面的八种方向中,加了*的并不常见,因为它们代表的是镜像方向,如果不做任何的处理,不管相机以任何角度拍摄,都无法出现镜像的情况。

这个表格代表什么意义?我们来看第一行,值为1时,右边两列的值分别为:Row #0 is Top,Column #0 is Left side,其实很好理解,它表示照片的第一行位于顶端,而第一列位于左侧,那么这张照片自然就是以正常角度拍摄的。

而这8种结果,就是第一行与第一列所在的位置的8种组合。

测试发现

(1)iOS手机横着拍的照片,照片方向显示正常。

(2) iOS手机竖着拍的照片,照片旋转了90度

测试发现照片Orientaion信息为:1、3、6、8四种状态。

我们在前端对图片进行像素处理或者drawInRect等操作之后,照片的Orientaion信息,即为拍照方向信息被删除了,所以iOS手机竖着拍的照片又回到了横着的状态,看起来也就是逆时针旋转了90°!

那么如何纠正这个旋转角度呢?

其实思路也很简单:在处理图片之前,先读取并保存图片的拍照方向信息,然后在处理图片之后,再根据拍照方向,对图片进行相应的调整,lrz.js 中的代码如下:

其中,translate是平移变换,scale(-1,1)是向左翻转,rotate是顺时针旋转。

switch (orientation) {

case 3:

context.rotate(180 * Math.PI / 180);

context.drawImage(that, -targetWidth, -targetHeight, targetWidth, targetHeight);

break;

case 6:

context.rotate(90 * Math.PI / 180);

context.drawImage(that, 0, -targetWidth, targetHeight, targetWidth);

break;

case 8:

context.rotate(270 * Math.PI / 180);

context.drawImage(that, -targetHeight, 0, targetHeight, targetWidth);

break;

case 2:

context.translate(targetWidth, 0);

context.scale(-1, 1);

context.drawImage(that, 0, 0, targetWidth, targetHeight);

break;

case 4:

context.translate(targetWidth, 0);

context.scale(-1, 1);

context.rotate(180 * Math.PI / 180);

context.drawImage(that, -targetWidth, -targetHeight, targetWidth, targetHeight);

break;

case 5:

React

  • 介绍一下react

  • React单项数据流

  • react生命周期函数和react组件的生命周期

  • react和Vue的原理,区别,亮点,作用

  • reactJs的组件交流

  • 有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

  • 项目里用到了react,为什么要选择react,react有哪些好处

  • 怎么获取真正的dom

  • 选择react的原因

  • react的生命周期函数

  • setState之后的流程

  • react高阶组件知道吗?

  • React的jsx,函数式编程

  • react的组件是通过什么去判断是否刷新的

  • 如何配置React-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker的安装及使用摘要

本文分享一些在docker安装及使用过程中的部分要点,会持续更新,供参考。 1. docker安装 1.1 在ubuntu系统安装 安装指定版本的docker。 # 更新时间:2024年6月23日# docker官方的源无法安装,采用阿里云的源安装docker # 更新软件…

2024.7.4作业

1.梳理笔记(原创) 2. 终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include <stdio.h> int main(int argc,const char *argv[]) { int y0,m0,d0,sum0,i0; …

[论文笔记] pai-megatron-patch Qwen2-72B-CT 后预训练 踩坑记录

经过以下修改,Qwen2-72B-CT可以正常训练,并且benchmark指标和loss正常。 Qwen2-72B-CT开长文本,256卡,16K会OOM,目前能开11K(11008)。 开context parallel需要后续测试。 [论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录_pai-megatron-patch 多机-CSDN博客 …

数据库表导出到excel:前置知识1 ALL_TAB_COLS

ALL_TAB_COLS 当前用户可访问的表、视图和群集的列的相关信息 其中几个字段: OWNER&#xff1a;表&#xff0c;视图及群集的Owner   TABLE_NAME&#xff1a; 表&#xff0c;视图及聚簇的名称   COLUMN_NAME&#xff1a; 字段名   DATA_TYPE &#xff1a;字段的数据类型…

python 字典 一个key 多 value 遍历

在Python中&#xff0c;如果一个键对应多个值&#xff0c;你需要确保这些值被存储在一个容器类型&#xff08;如列表或集合&#xff09;中。你可以使用默认字典&#xff08;collections.defaultdict&#xff09;来简化这个过程。以下是一个示例代码&#xff1a; from collecti…

python vtk lod 设置

在Python中使用VTK库设置Level of Detail (LOD)可以通过vtkLODProp3D类来实现。这个类允许你为一个模型指定不同级别的细节表示&#xff0c;从而在渲染时根据模型与摄像机的距离自动切换到更适合的表示。 以下是一个简单的例子&#xff0c;展示如何使用vtkLODProp3D来设置LOD&…

万字长文MySQL Binlog 详细指南

目录 第一阶段 MySQL Binlog 基础用法1. Binlog基本概念1.1 什么是Binlog1.2 Binlog的作用1.3 Binlog格式 2. 配置和管理Binlog2.1 开启Binlog2.2 设置Binlog文件大小和保留时间2.3 查看Binlog状态 3. Binlog的实际应用3.1 数据恢复3.2 主从复制3.3 审计 4. Binlog工具使用4.1 …

收银系统源码-收银台营销功能-购物卡

1. 功能描述 购物卡&#xff1a;基于会员的电子购物卡&#xff0c;支持设置时效、适用门店、以及可用商品&#xff1b;支持售卖和充值赠送&#xff0c;在收银台可以使用&#xff1b; 2.适用场景 会员充值赠送活动&#xff0c;例如会员充值1000元&#xff0c;赠送面值100元购…

LeetCode题解:205. 同构字符串,哈希表,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/isomorphic-strings/ 理解题意&#xff1a; s "foo"和t "bar"&#xff0c;s中的o同时映射了a和r&#xff0c;不正确s "badc"和t "baba"&#xff0c;t中的a同时映射了a和c&am…

145-四路16位125Msps AD FMC子卡模块

一、概述 该板卡可实现4路16bit 125Msps AD 功能&#xff0c;是xilinx开发板设计的标准板卡。FMC连接器是一种高速多pin的互连器件&#xff0c;广泛应用于板卡对接的设备中&#xff0c;特别是在xilinx公司的所有开发板中都使用。该AD&#xff0c;DA子卡模块就专门针对xilinx开发…

pytorch镜像如何通过dockerfile和启动脚本封装tensorboard

一&#xff1a;dockerfile文件内容&#xff0c;这里我们以pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel基础镜像为例&#xff1a; # 定义基础镜像 FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel# 设置非互动模式以避免一些安装过程中的对话框 ENV DEBIAN_FRONTENDnoni…

go语言并发编程2-runtime

runtime.Gosched() 作用是让出CPU时间片&#xff0c;重新等待安排任务。执行runtime.Gosched()后&#xff0c;其他协程优先执行&#xff0c;当前所在协程最后执行。 package mainimport ("fmt""runtime" )func main() {go func(s string) {for i : 0; i …

网络爬虫之爬虫逆向的学习途径、相关网站和学习资料

网络爬虫之爬虫逆向的学习途径、相关网站和学习资料 演练和学习网站 CTFTIME 一个全球性的CTF&#xff08;Capture The Flag&#xff09;赛事信息平台&#xff0c;收录了各类CTF比赛。你可以通过参加这些比赛来提升自己的逆向工程和安全技能。 安全客 由360公司运营的安全资讯…

iview 里面的ip 组件封装_iview ipinput

</ul><div v-if"erro_ip" style"color: red;">ip格式错误!</div> </div>最终的效果图如下&#xff1a;![](https://img-blog.csdnimg.cn/20190513170751269.png)最后为了方便大家的沟通与交流请加QQ群&#xff1a; [625787746]( )…

Github 2024-07-03开源项目日报Top10

根据Github Trendings的统计,今日(2024-07-03统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量JavaScript项目3Jupyter Notebook项目2Python项目2C++项目1Rust项目1TypeScript项目1Vue项目1Go项目1Moby 项目 - 软件容器化的开源工具集 创建…

波动方程 - 波动方程是个什么方程

波动方程 - 波动方程是个什么方程 flyfish 波动方程或称波方程&#xff08;英语&#xff1a;wave equation&#xff09;是一种二阶线性偏微分方程,波动方程是双曲型偏微分方程的最典型代表. 微分方程 微分方程&#xff08;Differential Equation&#xff09;是一类包含未知…

C++语言特性层(Language Features Layer)

1.语言基础 &#xff08;1&#xff09;指针 定义&#xff1a; 指针是一个变量&#xff0c;用于存储另一个变量的内存地址。 特性&#xff1a; 可变性&#xff1a;指针可以重新指向不同的变量。空指针&#xff1a;指针可以为空&#xff08;即指向 nullptr&#xff09;。大小&am…

羊大师:羊奶养生,解锁健康之道的新密码

在探寻健康与养生的旅途中&#xff0c;我们总渴望找到那把开启健康之门的钥匙。而今&#xff0c;羊奶以其独特的营养价值和健康益处&#xff0c;正悄然成为那把解锁健康之道的新密码。 羊奶&#xff0c;自古以来便是自然赋予的珍贵礼物。它富含优质蛋白、多种维生素及矿物质&am…

nginx的重定向(rewrite)

1、location 匹配 location匹配的就是后面的URL&#xff0c;对访问的路径做访问控制或者代理转发 共有三个匹配&#xff1a;精确匹配、正则匹配、一般配 a、精确匹配 格式&#xff1a;location/ 对字符串进行完全匹配&#xff0c;必须完全合 c、正则匹配 ^~&#xff1a;前…

Android 抓取 CPU 资源信息

在 Android 开发中&#xff0c;使用 ADB&#xff08;Android Debug Bridge&#xff09;命令获取 CPU 资源信息有很多重要的作用。这些命令可以帮助开发者在多种情况下分析和优化应用性能、解决问题以及进行系统性调试。 以下列举一些 ABD 获取 CPU 资源信息的命令 获取 CPU 核…