导航:首页 > 操作系统 > android相机方向

android相机方向

发布时间:2023-03-18 03:27:12

android Camera开发系列:调整Camera预览方向

有时候我们想根据自己的需要调整下Camera的预览方向,那么是调用哪个API可以达到我们的目的呢?

我们看下下图拍的几张小可爱的照片,分别是正常方向、旋转180度、90度拍的照片。

Camera1上,我们可以通过 setDisplayOrientation(int degress); 来设置camera预览的方向。

这里也贴下源码里面关于setDisplayOrientaion接口的详细说明。

Camera2的API上,找了一通,发现并没有像Camera1上,可以通过类似的接口来设置预览方向,不过可以通过TextureView.setTransform(matrix);来通过调整textureView的显示来达到目的。

Ⅱ android 相机开发取景方向不对怎么办

/亏启凳/设置拍摄方旁春向
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_main);
注意位置销旅

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

现在 android 平台的智能手机一般都标配有两颗摄像头。在 Camera 中都存在摄像头切换的功能。
并且有一些功能前后置改盯岁摄像头上会有所不同。譬如人脸检测,人脸识别,自动对焦,闪光灯等功能,
如果前置摄像头的像素太低,不支持该功能的话,就需要在前置摄像头上关掉该 feature.

那么是如何判断并切换前后置摄像头的呢?
我们先来看下核睁 CameraInfo 这则兄个类,

[java] view plain
/**
* Information about a camera
*/
public static class CameraInfo {
/**
* The facing of the camera is opposite to that of the screen.
*/
public static final int CAMERA_FACING_BACK = 0;

/**
* The facing of the camera is the same as that of the screen.
*/
public static final int CAMERA_FACING_FRONT = 1;

/**
* The direction that the camera faces. It should be
* CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
*/
public int facing;

/**
* The orientation of the camera image. The value is the angle that the
* camera image needs to be rotated clockwise so it shows correctly on
* the display in its natural orientation. It should be 0, 90, 180, or 270.

*
*
For example, suppose a device has a naturally tall screen. The
* back-facing camera sensor is mounted in landscape. You are looking at
* the screen. If the top side of the camera sensor is aligned with the
* right edge of the screen in natural orientation, the value should be
* 90. If the top side of a front-facing camera sensor is aligned with
* the right of the screen, the value should be 270.
*
* @see #setDisplayOrientation(int)
* @see Parameters#setRotation(int)
* @see Parameters#setPreviewSize(int, int)
* @see Parameters#setPictureSize(int, int)
* @see Parameters#setJpegThumbnailSize(int, int)
*/
public int orientation;
};

见名知义,它就是一个 Camera 信息类。它是通过与屏幕的方向是否一致来定义前后置摄像头的。

与屏幕方向相反即为 BACK_FACING_CAMERA
与屏幕方向一致即为 FRONT_FACING_CAMERA
那么在代码中我们是如何获取当前使用的 CamerInfo 呢

[java] view plain
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
当然,使用该代码的前提是要 import android.hardware.Camera.CameraInfo;

判断使用是前置还是后置摄像头,可以通过if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 来判断。
当Camera 的实例已经创建了的情况下,则需要通过如下方式来判断。

[java] view plain
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
//stopFaceDetection();
}

也可以通过 if(mCameraId == CameraInfo.CAMERA_FACING_FRONT) 来判断。
其中 mCameraId 是当前使用的 CameraId, 一般前置为1, 后置为 0。

Ⅳ Android 系统原生相机API角度原理与适配

虽然Camera作为第一代原生android所提供的相机类一直被开发者甚至Google官方开发人员所诟病,但为了兼容和适配Android版本5.0以下的App应用,我们别无选择。因此,有了本篇文档详细阐述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView与Camera类。

文档下文会在拍照流程中的不同的阶段应用到上述四个角度,而“终端自然方向”贯穿整个流程当中。这一个方向、四个角度非常重要,缺一不可,是支撑相机Camera 系列API的关键。在设计NXDesign的相机项目中,经过对官方文档的研读和各路资料的调研之后发现,我们在网络上查到的博客类相关资料有80%的实现方式是存在问题的,当然,这也可以归咎于该API其本身确实不好用,如果不对源码注释进行仔细研究,很容易对开发者产生误导。

更加准确的说,相机的生命周期是依托于SurfaceView的创建和销毁来完成的。SurfaceView的作用是提供相机内容的实时预览。我们需要在surfaceview创建好之后打开相机使用相机资源,在surfaceview被销毁后释放相机资源。

surfaceview 提供了holder机制向调用方通知surfaceview的变化时机,为了在不同的时机对相机资源做不同的事情,需要调用SurfaceHolder.addCallback()方法。

现在的Android手机一般会有多个摄像头,但根据其方向可以归为两类: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打开摄像头之前,首先需要获取相机资源,判断相机个数 Camera.getNumberOfCameras() 。每个相机对应一个CameraInfo,它的定义如下:

这里涉及到一个重要概念:相机图像传感器(camera sensor),想要理解上述注释的含义,就需要先理解下图内容。

左图是通常情况下,我们对view的x y方向的认知,以屏幕的左上角为原点向右为x正方向,向下为y正方向;但是,右图描述的是绝大多数情况下, 相机图像传感器 的起始位置和方向判定。与view不同的是,传感器以手机屏幕在自然方向上的右上角为原点,向下为x正方向,向左为y正方向。因此,我们理解上述注释就不难了。如果相机自带的传感器顶部与终端自然方向(手机屏幕的硬件方向,一般手机都是竖直方向,也就是文档中说的naturally tall screen)的右边缘一致,则这个值就是90度。如果前置摄像头传感器的顶部与手机自然方向一致,则这个值就是270度。

当我们定义startCamera()方法时,要做5件事情,1.遍历摄像头cameraId,找到想要打开的摄像头(前置还是后置);2.获取摄像头信息,主要获取orientation;3. 设置相机DisplayOrientation 4.设置相机参数,主要是宽高比、对焦模式、图片格式、setRotation等。5. 向camera设置surfaceview.viewholder,并且startPreview。主要逻辑如下:

拿到cameraInfo.orientation之后,要调用camera.setDisplayOrientation设置进去,保证通过surfaceview预览到的取景跟当前的手机方向保持一致,但是,setDisplayOrientation设置的其实是经过两个角度计算之后的复合角度,而并不单纯是cameraInfo.orientation。正确的做法是这样的:先获取手机屏幕的旋转方向,然后与cameraInfo.orientation加和得到最终角度。通常情况下,如果我们设置相机为portrait,则不用考虑rotation。这也是为什么绝大部分网络资料中都会粗暴的写入一个90度完事儿而并没有解释这么做的道理。

调用camera.takePicture(null, null, pictureCallback)

这里需要做的仅仅是将callback中返回的data存储为File。需要注意的是,data中会包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具类生成bitmap,再进行存储或者展示,生成出来的图像其实是缺失了旋转角度的原始方向,这十有八九会发生图像展示角度错误的情况。因此,需要直接保存,再通过Exif工具类读取File中的角度信息(当然Exif工具类就是为了读取File中的各种信息而生的,比如拍照时间、经纬度等等)。

基于Camera API,
surfaceview的预览需要setDisplayOrientation(),入参角度与CameraInfo.orientation(传感器偏角)和WindowManager.default.displayOrientation(屏幕旋转角度)两个角度有关。
相机拍照前需要setRotation(),入参角度与CameraInfo.orientation(传感器偏角)和OrientationEventListener返回的orientation(终端自然角度偏角)有关,二者的换算结果就是图像写入偏角,该偏角意味着图像被顺时针旋转该角度就能够回正展示。

Ⅳ Android中Camera方向问题总结

          如今生活当中每一个人都离不开手机,拍摄照片更加常见,刚好最近在研究Android中的Camera的“方向”问题,总结一下。好了,进入正题,通过手机的Camera拍摄出来的照片来自于相机的图像传感器,相机被固定到手机后,相机的图像传感器的图像采集方向就固定住了,因此相机传感器的采集图像的方向我们是改变不了,只能对采集后获得的图片数据进行旋转,以便得到正确的预览。我们可以通过CameraInfo对象的orientation属性来获取图像传感器的图像采集方向,orientation属性就描述着相机的图像传感器采集图像的方向,orientation是一个角度值,只能是0,90,180,270四个中的一个,表示的含义就是图像传感器采集图像的角度,忘记说了,这里的角度是相对于手机的“自然方向”来说的,何为“自然方向”?是指当宽比高短时,我们看到的手机的方向(竖屏),可以这样理解,这个值是相机所采集的图片需要顺时针旋转至自然方向的角度值,因为如果我们要想在手机的自然方向上正确预览相机拍照的图片数据,我们必须对相机传感器采集的图像进行顺时针旋转,这个旋转的角度就是orientation,注意只能对拍冲培照后获得的图片闹判或数据进行旋转,我们是无法改变相机传感器采集图像的方向的,因为它在相机被固定到手机上后,就被固定死了。 

             图像传感器的预览方向默认情况下是和图像传感器的图像采集方向是一致,也就是前面提到的orientation值,那这里为什么说默认呢?是因为相机传感器的预览方向是可以改变的,不像图像传感器的图像采集方向无法改变,通过Camera对象的setDisplayOrientation方法改变预览方向(顺时针旋转)。对大部分手机来说,后置摄像头的orientation为90,也就是说我们需要对拍照采集的图片数据顺时针旋转90度,才能够在自然方向正确预览我们拍摄后的图片,需要通过Camera对象的setDisplayOrientation顺时针旋转90度才能在自然方向正确预览我们的摄像头画面。同样对于大部分手机来说,前置摄像头的orientation通常为270度,也就是说我们需要对拍照采集的图片数据顺时针旋转270度,才能够在自然方向正确预览我们拍摄后的图片,但是我们预览方向我们却不是顺时针旋转270度,而是90度,这是为什么呢?因为前者摄像头会在旋转预览方向之前,会对预览方向来一个水平的镜像翻转,这就是为什么我们通过前者摄像头像是在照镜子一液伍般,可能还不太理解,我们会通过图片来对上面的分析进行演示。 

后置摄像头orientation=90,此时图像传感器采集图像的方向90度,相对于自然方向,如下:

此时图像采集的方向我们是无法改变的,但是能够改变预览的方向,通过setDisplayOrientation(90)顺时针旋转预览方向,以便在自然方向进行正确预览。

我们来看看前置摄像头orientation=270的情况,铭记前置摄像头预览方向在旋转之前会进行一个水平镜像翻转(可以理解为逆时针旋转180),这就是为什么我们通过手机前置摄像头预览时,看到的像是在照镜子一般。

此时我们需要将获取到的图片数据进行顺时针旋转270度,才能够在手机自然方向正确预览。接下来看看前者摄像头预览方向,注意咯

好了,就到这,水平有限,有什么错误的地方,希望各位大神留言,拜托了。

阅读全文

与android相机方向相关的资料

热点内容
安卓怎么关权限保护隐私 浏览:390
海牛微视app怎么用 浏览:70
单片机怎样选变压器 浏览:829
癌症pdf 浏览:725
云服务器镜像批量部署环境 浏览:683
安卓手机浏览器能访问什么网站 浏览:254
找不到网站的服务器ip地址该如何解决 浏览:743
算法十个数降序排列 浏览:95
基于单片机的老年人健康监测系统 浏览:706
python入门经典pdf下载 浏览:17
东芝变频2p空调压缩机 浏览:227
自家wifi怎么能加密 浏览:644
红米k40加密门禁卡 浏览:847
什么样的源码好看 浏览:156
手机主服务器有什么用 浏览:612
程序编写命令 浏览:597
android发送心跳包 浏览:385
指标源码和原理 浏览:700
汽车空调压缩吸盘 浏览:208
崽崽因app版本不同不能邀请怎么办 浏览:686