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

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

正常方向

旋转180度

旋转90度

一、Camera API

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

mCamera.setDisplayOrientation(Surface.ROTATION_180);

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

/**

* 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.

*

*

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.

*

*

If you want to make the camera image show in the same orientation as

* the display, you can use the following code.

*

* public static void setCameraDisplayOrientation(Activity activity,

* int cameraId, android.hardware.Camera camera) {

* android.hardware.Camera.CameraInfo info =

* new android.hardware.Camera.CameraInfo();

* android.hardware.Camera.getCameraInfo(cameraId, info);

* int rotation = activity.getWindowManager().getDefaultDisplay()

* .getRotation();

* int degrees = 0;

* switch (rotation) {

* case Surface.ROTATION_0: degrees = 0; break;

* case Surface.ROTATION_90: degrees = 90; break;

* case Surface.ROTATION_180: degrees = 180; break;

* case Surface.ROTATION_270: degrees = 270; break;

* }

*

* int result;

* if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

* result = (info.orientation + degrees) % 360;

* result = (360 - result) % 360; // compensate the mirror

* } else { // back-facing

* result = (info.orientation - degrees + 360) % 360;

* }

* camera.setDisplayOrientation(result);

* }

*

*

*

Starting from API level 14, this method can be called when preview is

* active.

*

*

Note: Before API level 24, the default value for orientation is 0\. Starting in

* API level 24, the default orientation will be such that applications in forced-landscape mode

* will have correct preview orientation, which may be either a default of 0 or

* 180\. Applications that operate in portrait mode or allow for changing orientation must still

* call this method after each orientation change to ensure correct preview display in all

* cases.

*

* @param degrees the angle that the picture will be rotated clockwise.

* Valid values are 0, 90, 180, and 270.

* @throws RuntimeException if setting orientation fails; usually this would

* be because of a hardware or other low-level error, or because

* release() has been called on this Camera instance.

* @see #setPreviewDisplay(SurfaceHolder)

*/

public native final void setDisplayOrientation(int degrees);

二、Camera2 API

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

public void openCamera(){

CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);

try {

......

//调整预览画面显示方向

configureTextureViewTransform(mTextureView.getWidth(),mTextureView.getHeight());

manager.openCamera(cameraId, mStateCallback, null);

......

}

}

private void configureTextureViewTransform(int viewWidth, int viewHeight) {

if (null == mTextureView) {

return;

}

int rotation = 0 ;/*activity.getWindowManager().getDefaultDisplay().getRotation();*/

Matrix matrix = new Matrix();

RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);

RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());

float centerX = viewRect.centerX();

float centerY = viewRect.centerY();

if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {

bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());

matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);

float scale = Math.max(

(float) viewHeight / mPreviewSize.getHeight(),

(float) viewWidth / mPreviewSize.getWidth());

matrix.postScale(scale, scale, centerX, centerY);

matrix.postRotate(90 * (rotation - 2), centerX, centerY);

}else if (Surface.ROTATION_180 == rotation) {

matrix.postRotate(180, centerX, centerY);

}

mTextureView.setTransform(matrix);

}

*本人从事Android Camera相关开发已有5年,

*目前在深圳上班,

*小伙伴记得点我头像,看【个人介绍】进行关注哦,希望和更多的小伙伴一起交流 ~

android camera移动方向_Android Camera开发系列:调整Camera预览方向相关推荐

  1. android抖音切换实现,【Android 进阶】仿抖音系列之视频预览和录制(五)

    前言 大家好,在前几篇中,我们通过2种方式实现了仿抖音的翻页切换视频,仿抖音列表播放视频功能:这一篇,我们来说说视频的录制. 主流的视频录制,一般都采用的是FFmpeg 例如 腾讯短视频,由于FFmp ...

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

    Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题. 图像的Sensor方向:手机Camera的图像数据都是来自于摄 ...

  3. Android 音视频开发(二) -- Camera1 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  4. Android 音视频开发(三) -- Camera2 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  5. Android 相机预览方向和拍照方向

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

  6. Android相机预览方向

    以前对Camera了解的不是太深入,最近有需求把人脸识别 集成到项目,必然会与Camera打交道,遇到一些坑,与大家分享一下. 一.预览方向   Camera.CameraInfo info = ne ...

  7. android 预览和拍照成像方向不一致,Android相机预览方向深入探究

    原标题:Android相机预览方向深入探究 今日快讯 9月7日,北京市交通委召集各区管理部门和15家共享自行车企业负责人,听取共享自行车投放和管理的意见建议,研究决定并下发通知,暂停在本市新增投放共享 ...

  8. 【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览

    转自:https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关 ...

  9. android camera2预览方向,Android Camera2预览偶尔会旋转90度(示例代码)

    我正在使用Android的Camera2 API开发一些应用程序.到目前为止,我已经能够在TextureView中显示预览.该应用程序默认为横向模式.使用模拟器时,预览将显示为颠倒.在我的物理Nexu ...

最新文章

  1. MySql存储引擎特性对比
  2. SAP WM中阶之存储类型设置界面里的’Return Stock To Same Storage Bin’
  3. 加拿大留学商科好还是计算机科学好,去加拿大读商科专业就是要选择这些才最好!...
  4. Java StringBuffer与StringBuider
  5. leetcode503. 下一个更大元素 II
  6. hdoj 1247 Hat’s Words(字典树)
  7. 十一、CSS初始化详解
  8. bat 存储过程返回值_使用Mybatis过程中遇到的坑
  9. Redis的基础事务
  10. 湖北汽车工业学院c语言程序设计 汽车零部件采购管理程序,湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统).docx...
  11. CAD自带图案填充代表意思
  12. 基于Matlab数字图像处理微表情情绪识别系统
  13. 解决VMware 小度wifi 驱动报错问题 Driver error
  14. javaweb超市仓库管理系统
  15. 淘宝店铺介绍范文如何写的技巧详细分析!
  16. extra argument in call
  17. Outlook邮件撤回有时间限制吗_怎么操作?
  18. surface usb启动_Surface Book 2开发人员印象和USB-C的魔力
  19. python抓取小红书_小红书很难爬?最新爬取方法教给你啦~
  20. 对云计算及云服务的理解

热门文章

  1. PC1-PC2的过程及带宽的理解和查询
  2. 双十一LoanMarket压力测试报告
  3. 微信3D小游戏系列一:在微信小游戏中使用threejs
  4. 客户自己下单软件|移讯云网上手机订货管理软件
  5. 瓦刀发布,必属精品:Domino评审、表决系统
  6. 事业群-部门-岗位辨析
  7. 医疗信息管理系统(业务介绍)
  8. 【Unity Texture】Texture用法
  9. Windows 10中C盘容量不足怎么办?
  10. pandas条件复合筛选(多条件、与、或)