android Camera 设置概述
来源:互联网 发布:假身份证骗网络贷款 编辑:程序博客网 时间:2024/05/22 01:44
不废话
首先,我们罗列出android 使用相机时涉及的东西:
camera 实例
surfaceview 预览框
surfaceHolder 帧处理工具
preview size camera 的预览尺寸
picture size camera 拍照后照片的尺寸
CameraInfo 相机信息类
Camera.Paramaeters 相机的参数类
前置后置摄像头 CameraInfor.facing
CameraId 摄像头的 id
CameraCount 摄像头数量
我们想要用相机,首相我们要了解我们当前手机的摄像头硬件信息,如支持的预览尺寸、图片尺寸、摄像头默认角度等,这些信息的获取就是通过 CameraInfo 类来获取。
大致的流程是:
1、利用 CameraInfo 类 获取摄像头信息
2、 获取相机实例
3、设置摄像头参数
4、设置预览控件
5、开始预览
6、拍照保存
7、重新预览
8、停止预览,释放相机资源
首先 Camera提供了静态方法来获取 摄像头的数量,
这个数量 由 0开始便是对应摄像头的 ID
<span style="white-space:pre"></span>int numberOfCameras = Camera.getNumberOfCameras(); cameraInfoList=new ArrayList<>(numberOfCamera); Camera.CameraInfo cameraInfo=null;//摄像头信息的容器 for(int id=0;id<numberOfCamera;id++){ cameraInfo=new Camera.CameraInfo(); Camera.getCameraInfo(id,cameraInfo); cameraInfoList.add(id,cameraInfo);//在对应索引下加入 摄像头的信息 }
现在我们已经获取了手机所有摄像头的信息 (虽然它可能不超过2个)
下面我们要根据这些信息来选择我们要打开那个摄像头,前置还是后置
在 CameraInfo 这个类中有个属性 cameraInfo.facing ,这个值标志着摄像头是前置还是后置
下面我们获取摄像头的实例
<span style="white-space:pre"></span>if(cameraInfo.facing== Camera.CameraInfo.CAMERA_FACING_BACK){//表明当前摄像头是后置摄像头 camera=Camera.open(id);//获取后置摄像头实例 }else if(cameraInfo.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){//表明当前摄像头是后前置摄像头 }
此时我们已经占有了手机的摄像头资源,如果它没有被占用的话。
接下来是重点了 摄像头参数的设置
包括 预览方向、照片方向、预览尺寸、照片尺寸、照片格式、预览帧率等等;
想要设置的话我们要先知道,我们的摄像头都支持哪些方向、尺寸、格式;
我们先说尺寸,目前市场上的主流手机 基本都是16:9的屏幕尺寸,如果你的相机想用全屏模式预览的话 就需要在所支持的尺寸中找16:9 尺寸的 并在其中选一个比较合适的分辨率,当然分辨率越高预览画质越好。
以16:9 为例
首先获取摄像头的 Parameters
然后获取所支持的所有预览尺寸
Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> supportPreviewSizes = parameters.getSupportedPreviewSizes(); Camera.Size bestSize = null; for (Camera.Size size : supportPreviewSizes) { if (size.height / 16 == size.width / 9) {//比率符合16:9 bestSize=size; //这里可以进行预览尺寸的判断 根据你的需要 选择合适的尺寸 }else {// continue } }
接下来用同样的办法获取我们想要的照片尺寸。为了保证预览与拍照能够展现的一致,我们照片尺寸也选择16:9 ,而保存图片的大小我们也需要一定的选择,我们这里先不管它
List<Camera.Size> supportPictureSizes = parameters.getSupportedPreviewSizes(); Camera.Size bestSize = null; for (Camera.Size size : supportPreviewSizes) { if (size.height / 16 == size.width / 9) {//比率符合16:9 bestSize=size; //这里可以进行预览尺寸的判断 根据你的需要 选择合适的尺寸 }else {// continue } }
好 下面是比较让人头疼的问题了,由于 android 手机的厂商没有同意的标准 所以造成在硬件上有一些不一致,比如这个 camera 的 oriention;
在这个问题上我要强调一点,camera.setOriention()设置的是预览的成像方向,而 camera.parameters.setRotation() 设置的是照片的方向
以我的项目为例 我的华为手机camera 的 orientation 在后置和前置摄像头时 值分别为 90 和 270 ,另一台 Moto 的Nexus 6 则是 90 90 ;
目前我的经验手机在正常使用的姿势时,你的左手边为 camera oriention=0 ,(顺时针 oriention 增加),我们看到假设我们使用后置摄像头,
以华为手机为例 :
此时我获得的 cameraInfo 中 oriention = 90 那么我设置 camera.setDisplayOriention(90);(注意:这个90 和 oriention 的90是纯属巧合 因为竖屏的手机成像就是90 如果你需要的是横屏拍摄 这个值就应该设置为 180 )使得预览的成像与我们看见的是一致的。
正常姿势的手机右手边是 displayOriention=0 逆时针旋转增加角度 垂直向上为90 左手边为 180 正下方为270 ,
所以当你camera.setDisplayOriention(0)的时候,就是告诉系统 预览的时候 人头朝向手机左边哦!
所以当你camera.setDisplayOriention(90)的时候,就是告诉系统 预览的时候 人头朝向手机正上方哦!
所以当你camera.setDisplayOriention(180)的时候,就是告诉系统 预览的时候 人头朝向手机右边哦!
所以当你camera.setDisplayOriention(270)的时候,就是告诉系统 预览的时候 人头朝向手机正下方哦!
然后我们切换到前置摄像头 oriention =270 这时我要设置 camera.setDisplayOriention(90);么? 错!!如果设置成90 你会看到倒立的预览
为什么是倒立的?
仔细看 倒立的 说明 多旋转或是少旋转了180° ,对的 在使用前置摄像头时 camera.setDisplayOriention(270+180)才能在正常姿势的手机上看到正常的预览;
camera.setDisplayOriention();形参的范围是-360~360 ;
这样直接加到一起会报错的哦!! 所以 camera.setDisplayOriention((270+180)%360);
接着我们说说 parameters.setRotation()的作用:
简单地说就是 设置你照片的角度了 跟 oriention 的一样 也是 0 90 180 270 分别代表图像底部指向手机的四个方向;
https://github.com/vvweilong/cameraInfor/tree/master 加一个demo
这个例子可以 点击增加 displayorien , 点击更改 parameters.rotation 每次增加90,点击切换前后置摄像头,点击拍照 观看 照片的变化。
关于 拍照的照片 始终保持 正立 请听下回分解吧,其实就是 根据手机传感器的变化判断手机的姿态然后更改 rotation 的值 是成像的方向与手机预览相对应而已。
就酱……
- android Camera 设置概述
- android camera HAL v3.0概述
- android camera HAL v3.0概述
- android camera HAL v3.0概述
- android CAMERA 设置照片大小
- android CAMERA 设置照片大小
- android CAMERA 设置照片大小
- Android camera 设置聚焦区域
- Camera概述
- S5PV210 Android CAMERA设置照片大小
- camera驱动概述
- com.android.camera.Camera
- Android camera预览参数以及实际图像大小设置
- android 原生camera——设置模块修改
- Android camera
- Android Camera
- android camera
- android camera
- 乐乐音乐播放器使用
- WPF ArcGis仿高德地图拖拽画圆
- 注册后通过邮件激活注册
- 多线程总结--线程池ThreadPoolExecutor
- Ngnix 配置介绍 (配置,启动,重启)
- android Camera 设置概述
- 第五篇.android的调试工具的相关
- Mysql学习总结(1)——常用sql语句汇总
- 心若在梦就在,二次择业,青鸟助我成功
- ActiveMQ常见的高可用架构模式及使用LevelDB、ZooKeeper进行高可用消息架构
- Gabor滤波器的特征提取C++实现
- (POJ3308)Paratroopers 最大流最小割,建图,模板题
- Silex:security(一)
- shell编程