Android Camera使用

Posted dsliang12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Camera使用相关的知识,希望对你有一定的参考价值。

转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/51542071
本文出自:【梁大盛的博客】

Androd Camera使用

引:摄像头的使用大家应该个个都是行家,但是作为一个开发者的角度出发.摄像头又展现给我们什么呢?

理解Camera旋转的正确姿势

  • 90度来来源

很多开发者第一次接触摄像头的时候应该都是发现一个很严峻的问题-通过surfaceView预览摄像头的成像的时候上下,左右都颠倒了.
具体看看其实就好像摄像头的位置给旋转了90度.

这是神马回事?要理解这一个问题,我们首先从屏幕的角度出发.

  • 屏幕取景
    例如,现在是身处大海边.你所看到到风景一个是这样.是吧,没错吧.这时候掏出手机拍照完全是一件很符合逻辑的事情.

这个时候你掏出手机拍一张,应该是这样的姿势.你手机预览框应该看到的是这样.

事实上如果你不做特殊的处理应该是这样.

  • 摄像头和你想象中的不一样

导致这个问题的根源在于摄像头和你想象中的完全不一样.摄像头是x轴比y轴要大.这是什么意思?细细想想,以前用数码相机拍出来的相片不都是水平的么?所以你可以百度上网摄像头的规格,基本都是1980*1080,1600*1200,1400*10501280*1024等等.(具体自行百度)

首先我们手机默认情况下是竖屏(宽小高大),然而摄像头是横屏(宽大高小).这个怎么办?其实也不就是屏幕和摄像头形成90度夹角而已嘛!所以一般处理手段都是把摄像头旋转90度安装在手机背面.所以90度是源于此!(数码相机一般都是横屏所以不存在这个问题.)

嘿嘿,好像问题都解决了吧?too yang too simaple!
事实上为什么还会出现上下,左右颠倒呢?这就要说另一样东西了!现在每一个厂家在设计手机的时候都会把摄像头旋转90度安装,但是摄像头君它并不知道啊!并不知道!并不知道!

所以,当摄像头被旋转90度以后效果是这样的!
因为我旋转以后也得把原点放在左上角啊!然后什么情况出现呢?当预览的时候活生生把一个横屏输出的图像展示在一个竖屏的屏幕中,所以才会出现上下,左右颠倒了.

其实这个问题很简单就能处理了.调用setDisplayOrientation函数在预览的时候旋转一个角度.
这就是理解Camera旋转的正确姿势!

识别,拍照

什么是识别?什么是拍照?
对于android来说,摄像头有很多回调函数.
我们也可以根据需要添加回调函数.对焦成功的时候,有最新一帧预览图片的时候,成功拍照之前的时候,成功拍照并且设备回返未处理的原始数据的时候,成功拍照并且设备返回压缩后的图片的时候……太多太多了!

一般来说关注两个回调函数即可!

  • 有最新一帧预览图片的时候(简称,T1)
  • 成功拍照并且设备返回压缩后的图片的时候(简称,T2)

这两个时间点是很重要,并且大有文章可以做.首先说说第二种情况

T2很明显是设备能删除图像数据的时间点,我们一般只需把数据流持久化即可.应该保存在内存卡的保存在内存卡,应该保存在内在Flash的就保存在Flash.因地制宜.

T1就比较特殊,当我们把摄像头预览打开的以后.摄像头每时每刻都会把图像输出到我们的预览框中(Android 使用SurfaceView实现预览框).事实上我们不可能对没一刻的图像都进行业务的处理.
最常用的办法是调用setPreviewCallback 函数设置一个PreviewCallback回调函数.在设置PreviewCallback回调函数以后,当有一帧最新的预览图片的时候删除的时候调用onPreviewFrame函数.我们在onPreviewFrame可以获取此桢图像进行人脸识别,笑脸检测等等高等数学的事情.注意到这个时间点了么?

在onPreviewFrame处理大量的数据是需要时间的!这处理的这一段时间摄像头还是有数据源源不断的输出到SurfaceView.但是我们都忽略掉.在onPreviewFrame处理完一帧数据以后,改标识出人脸的标识出来.当然在onPreviewFrame处理完高等数学的操作以后,必定会在重新设置setPreviewCallback添加一个PreviewCallback回调函数以便进入下一轮的处理.当计算速度很快的时候这一连串的在流上一点一点的操作就会练成一线!事实上也如此.

所以我们可以理解很多在预览时候进行处理的基本上都是通过setPreviewCallback函数和PreviewCallback完成的.

注意:
setDisplayOrientation 会令预览的图像旋转,但是不会影响onPreviewFrame获取到的图片!

附上一个简单的demo(能控制闪光灯,对焦模式,预览图片大小,拍照图片大小.图片保存路径-\\手机存储\\CapturePicture):
https://github.com/dsliang/CameraDemo

以上是关于Android Camera使用的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 在 Android 上构建 react-native-camera 错误

android 怎么从camera中获取流

Android Camera2拍照——使用SurfaceView

关于使用Android新版Camera即Camera2的使用介绍 暨解决Camera.PreviewCallback和MediaRecorder无法同时进行

Android 已弃用 android.hardware.Camera,现在建议使用 android.hardware.camera2 但这在 API 21 以下的任何内容中均不可用

android Camera 如何判断当前使用的摄像头是前置还是后置