android camera移动方向_Android Camera开发系列:调整Camera预览方向
有时候我们想根据自己的需要调整下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预览方向相关推荐
- android抖音切换实现,【Android 进阶】仿抖音系列之视频预览和录制(五)
前言 大家好,在前几篇中,我们通过2种方式实现了仿抖音的翻页切换视频,仿抖音列表播放视频功能:这一篇,我们来说说视频的录制. 主流的视频录制,一般都采用的是FFmpeg 例如 腾讯短视频,由于FFmp ...
- Android开发实践:掌握Camera的预览方向和拍照方向
Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题. 图像的Sensor方向:手机Camera的图像数据都是来自于摄 ...
- Android 音视频开发(二) -- Camera1 实现预览、拍照功能
音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...
- Android 音视频开发(三) -- Camera2 实现预览、拍照功能
音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...
- Android 相机预览方向和拍照方向
我们知道手机 Camera 的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个 Sensor 被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横 ...
- Android相机预览方向
以前对Camera了解的不是太深入,最近有需求把人脸识别 集成到项目,必然会与Camera打交道,遇到一些坑,与大家分享一下. 一.预览方向 Camera.CameraInfo info = ne ...
- android 预览和拍照成像方向不一致,Android相机预览方向深入探究
原标题:Android相机预览方向深入探究 今日快讯 9月7日,北京市交通委召集各区管理部门和15家共享自行车企业负责人,听取共享自行车投放和管理的意见建议,研究决定并下发通知,暂停在本市新增投放共享 ...
- 【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览
转自:https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关 ...
- android camera2预览方向,Android Camera2预览偶尔会旋转90度(示例代码)
我正在使用Android的Camera2 API开发一些应用程序.到目前为止,我已经能够在TextureView中显示预览.该应用程序默认为横向模式.使用模拟器时,预览将显示为颠倒.在我的物理Nexu ...
最新文章
- MySql存储引擎特性对比
- SAP WM中阶之存储类型设置界面里的’Return Stock To Same Storage Bin’
- 加拿大留学商科好还是计算机科学好,去加拿大读商科专业就是要选择这些才最好!...
- Java StringBuffer与StringBuider
- leetcode503. 下一个更大元素 II
- hdoj 1247 Hat’s Words(字典树)
- 十一、CSS初始化详解
- bat 存储过程返回值_使用Mybatis过程中遇到的坑
- Redis的基础事务
- 湖北汽车工业学院c语言程序设计 汽车零部件采购管理程序,湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统).docx...
- CAD自带图案填充代表意思
- 基于Matlab数字图像处理微表情情绪识别系统
- 解决VMware 小度wifi 驱动报错问题 Driver error
- javaweb超市仓库管理系统
- 淘宝店铺介绍范文如何写的技巧详细分析!
- extra argument in call
- Outlook邮件撤回有时间限制吗_怎么操作?
- surface usb启动_Surface Book 2开发人员印象和USB-C的魔力
- python抓取小红书_小红书很难爬?最新爬取方法教给你啦~
- 对云计算及云服务的理解