Android开发实践:掌握Camera的预览方向和拍照方向

Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题。


图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角:

wKiom1SWRlPS8A37AABKPmT4jEM721.jpg


Camera的预览方向:由于手机屏幕可以360度旋转,为了保证用户无论怎么旋转手机都能看到“正确”的预览画面(这个“正确”是指显示在UI预览界面的画面与你人眼看到的眼前的画面是一致的),Android系统底层根据当前手机屏幕的方向对图像Sensor采集到的数据进行了旋转处理,然后后才送给显示系统,因此,打开Camera应用后,无论怎么旋转手机,你都能看到“正确”的画面,Android系统提供一个API来手动设置Camera的预览方向,叫做setDisplayOrientation,默认情况下,这个值是0,与图像Sensor方向一致,所以对于横屏应用来说,就不需要更改这个Camera预览方向。但是,如果你的应用是竖屏应用,就必须通过这个API将Camera的预览方向旋转90,与手机屏幕方向一致,这样才会得到正确的预览画面。


Camera的拍照方向:当你点击拍照按钮,得到的图片方向不一定与画面中预览的方向一致,这是因为拍摄的照片是将图像Sensor采集到的数据直接存储到SDCard上的,因此,Camera的拍照方向与上述的Camera的图像Sensor方向一致。


为了演示这个问题,我用手机的Camera对同一个场景拍了两张照片,第一张是横着拿手机拍的,第二张是竖着拿手机拍的。然后用在电脑上打开得到的图片(实际场景中的杯子是竖着的),效果如下所示:


wKiom1SWJRTi0PqOAAG0VYlk6aQ451.jpg


由此可见,如果横向拿手机拍照,由于正好与Camera的拍照方向一致,因此得到的照片是“正确”的;而竖着拿手机拍照的话,Camera的图像Sensor依然以上面描述的角度在采集图像并存储到SDCard上,所以得到的图片就是右图这样的,因为竖着拿手机正好与图像Sensor的方向相差了90度。由此,大家应该明白了为什么我们用手机拍出的照片经常需要旋转90度才能看到“正确”的画面了吧?


我想上面的介绍应该已经把这个问题讲清楚了,下面我还想再深入一下,介绍一下设置Camera预览方向的那个API(setDisplayOrientation)。


上面说了,对于横屏应用,不需要额外设置这个方向,但是对于竖屏应用,则需要调用setDisplayOrientation(90),来保证Camera的预览方向与Activity的方向一致,那么设置了这个函数究竟会不会影响到Camera拍照的结果呢?根据上面的分析,理论上应该是不影响的,因为拍照得到的图片方向是与图像Sensor的方向一致的,当然,我们可以通过Android官方API的注释文档验证一下这个猜想,下面是Camera.setDisplayOrientation的注释文档:


/*** Set the clockwise rotation of preview display in degrees. This affects* the preview frames and the picture displayed after snapshot. This method* is useful for portrait mode applications. Note that preview display of* front-facing cameras is flipped horizontally before the rotation, that* is, the image is reflected along the central vertical axis of the camera* sensor. So the users can see themselves as looking into a mirror.** <p>This does not affect the order of byte array passed in {@link* PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos. This* method is not allowed to be called during preview.     */public native final void setDisplayOrientation(int degrees);


重点看这两句话:


This affects the preview frames and the picture displayed after snapshot.This does not affect the order of byte array passed in {@link* PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos.


由此我们得到验证了,这个API修改的仅仅是Camera的预览方向而已,并不会影响到PreviewCallback回调、生成的JPEG图片和录像文件的方向,这些数据的方向依然会跟图像Sensor的方向一致。


关于Android Camera的预览和拍照方向的介绍就到这里了,希望对Camera应用开发的新手们能有所帮助,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


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

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

相关文章

mknod命令:创建设备文件

参考博客&#xff1a;mknod_liangkaiming的博客-CSDN博客 参考资料&#xff1a;man手册 可以通过man 1 mknod查看mknod命令的内容。 1、mknod 命令的作用是make block or character special files&#xff0c;即创建块设备或者字符设备文件。 2、mknod 命令的格式是&#xf…

DreamWeaver使用技巧学习心得

全是我在平时学习网页时积累的&#xff0c;觉得会对遇到同样问题的友人有帮助&#xff0c;都是一些觉得困惑好久然后豁然开朗的心得。 希望大家都能体会到&#xff0c;解决难题后的快乐。 都是我恍然大悟的地方&#xff0c;不够恍然大悟的就不贴上来了。 1.让一个区块居中&…

【转】每天一个linux命令(39):grep 命令

原文网址&#xff1a;http://www.cnblogs.com/peida/archive/2012/12/17/2821195.html Linux系统中grep命令是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹 配的行打印出来。grep全称是Global Regular Expression Print&#xff0c;表示全…

SecureCRT显示乱码的解决办法

发现问题 在Ubuntu中编写代码&#xff0c;输出语句里带有中文&#xff0c;比如"printf("读出来的内容是&#xff1a;%s.\n", buf);"。使用交叉编译工具链编译后&#xff0c;将可执行程序转移至开发板系统运行&#xff0c;并使用SCRT来观测测试结果。此时发…

WCF数据契约

当使用DataMember时&#xff0c;和访问符无关&#xff0c;及时使用了private&#xff0c;成员都是可见的。相反如果使用static&#xff0c;为不可见。 上述的两个数据成员是等效的&#xff0c;如果是等效的话 数据成员的顺序也必须是相同的。 4.数据契约已知类型——使用KownTy…

Linux中NFS服务器的配置(/etc/export)

本文转载于NFS /etc/exports参数解释&#xff0c;有修改。 问题引入 之前利用NFS从ubuntu中下载根文件系统到开发板&#xff08;见博客以NFS方式挂载rootfs的设置方法&#xff09;&#xff0c;但只是遵照教程安装的&#xff0c;对里面的设置含义不是很清楚。后来在开发板上上进…

cocos2d 很水很水的看法

这几天接了个扯淡的项目 cocos2d的 。 本来以为是Cpp的&#xff0c; 结果不是2dx &#xff0c;而是OC的2d。看了几天的官方的dome &#xff0c;大概知道是什么样子的。我就简单的纪录一下好了: cocos2d的整个框架呢&#xff0c; 分为3层 — 类似舞台剧 演戏嘛 肯定有个boss的 …

详解EBS接口开发之采购申请导入

更多内容可以参考我的博客 &#xfeff;&#xfeff;详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*--将数据写入至采购申请接口表*/PROCEDURE insert_procure_main(errbuf OUT NOCOPY VARCHAR2,retcode OUT NOCOPY VARCHAR2)…

sys文件系统

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 前言 Linux2.6版本的内核引入了sys文件系统。 在 proc文件系统介绍和使用 中&#xff0c;介绍了sys文件系统与proc文件系统的差异。它们都是虚拟文件系统&#xff0c;都是内核中的数据结构的可视化接口。它…

spring mvc 配置解析之xml

2019独角兽企业重金招聘Python工程师标准>>> ##mvc.xml中可配置的元素## 既然是xml,当然是要遵循schema的规定. 那么schema文件在哪呢? 定位方法就是解开这个jar文件,找到META-INF/spring.schema文件,这是个文本文件,里面包含了namespace以及其对应的xsd文件的位置…

IOS-UITextField类

文字属性 text placeholder   //默认使用70%灰色 font textColor textAlignment 文字大小 adjustsFontSizeToFitWidth minimumFontSize 编辑行为 editing     //是否正在编辑(read-only) clearsOnBeginEditing 展现形态 borderStyle     //默认UITextBord…

tree命令:以树的形式列出目录中的文件

在linux命令行中&#xff0c;输入“man 1 tree”可以得知tree命令的用法。 这里讲解几个常用的选项。 tree -L level_num &#xff1a;Max display depth of the directory tree. 比如“tree -L 1”&#xff0c;表示深度为1层。 rootubuntu:/sys# ls block bus class de…

JDBC学习笔记——事务、存储过程以及批量处理

2019独角兽企业重金招聘Python工程师标准>>> 1、事务 1.1、事务的基本概念和使用示例 数据库事务&#xff0c;是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完整…

验证码识别笔记(二)

这是验证码识别的第二篇&#xff0c;先看一下样图吧&#xff0c;就是下面那张。 看到这张图片&#xff0c;直观上就知道比第一篇中的要简单&#xff0c;这个“简单”用语言来描述&#xff0c;可以得到下面的几条结论&#xff1a; 1. 图片中的字符边界比较清晰&#xff0c;并且单…

dd命令:用于读取、转换并输出数据

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 命令作用 从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、设备或标准输出。 参数说明 if文件名&#xff1a;输入文件名&#xff0c;默认为标准输入。即指定源文…

centos6.5下搭建oracle 11g

为什么80%的码农都做不了架构师&#xff1f;>>> 安装依赖 yum install binutils compat-libstdc-33 compat-libstdc-33.i686 \ elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc glibc.i686 \ glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh…

Unix基本系统数据类型和stat结构体

Unix基本系统数据类型 历史上&#xff0c;某些UNIX变量已与某些C数据类型联系在一起&#xff0c;例如&#xff0c;历史上主、次设备号存放在一个1 6位的短整型中&#xff0c; 8位表示主设备号&#xff0c;另外8位表示次设备号。但是&#xff0c;很多较大的系统需要用多于256个值…

回环设备(/dev/loop*)与losetup命令

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 之前曾利用losetup命令进行根文件系统镜像文件的制作&#xff0c;但不明白其命令含义。 二、回环设备 命名方式 回环设备一般以 /dev/loop* 方式命名。 回环设备的含义 回环设备是一种伪设备&#…

oracle中游标的使用

1&#xff09;--- 使用带参数的游标;declareCURSOR stock_cur(symbol_in VARCHAR2) IS SELECT * FROM rate_combine_nr nr WHERE nr.combine_nosymbol_in;stock_info stock_cur%ROWTYPE; beginOPEN stock_cur(G600000001); --打开游标;loop FETCH stock_cur INTO stock_inf…

JS 学习笔记--11---内置对象(Global/Math)

练习中使用的浏览器是IE10&#xff0c;如果各位朋友有不同意见或者遇到浏览器不兼容问题&#xff0c;希望指正 1、内置对象的定义&#xff1a;有ECMAScript实现提供的、不依赖与宿主环境的对象&#xff0c;在ECMAScript运行之前就已经创建好的对象就叫做内置对象。就是说&…