Android Camera 预览角度和拍照保存图片角度相关
–基于Android R(11)
关于Camera
Camera Framework 的架构
Android Camera Framework 是一个分层架构,由以下组件组成:
- HAL(硬件抽象层): HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.
- CameraService : CameraService 是框架的核心,管理相机设备并为应用程序提供访问 HAL 的接口.
- Camera 应用程序 : Camera 应用程序是面向用户的界面,允许用户控制相机设置、预览取景器并拍摄照片或视频.
以 Android 原生 Camera2 应用程序为例,PhotoModule 和 VideoModule 展示了如何使用 Camera Framework 构建高级相机应用程序.
PhotoModule 负责管理照片拍摄.
VideoModule 负责管理视频录制.
Android 最新Camera框架
Camera 架构
AndroidO Camera(API 2)openCamera 流程
关于Camera预览
Camera的图像数据来源于摄像头硬件的图像传感器,图像传感器被固定到手机上后会有一个默认的方向.
如果默认的图像传感器为横向,而所用设备拍照是竖向的,比如手机,但得到的图片数据依然会是横向的,因为这个数据取决于图像传感器的方向.
由于Camera默认是横向的,竖向拍照时得到的照片和预览的照片会有所不同.
Camera1 API 上可以利用setDisplayOrientation(int rotateDegree)设置预览角度调节预览图片.
setDisplayOrientation只是改变了预览的角度,而拍摄生成图片的角度还是和默认图片传感器方向一致.
Camera2 API --通过TextureView.setTransform(matrix) 接口来调整textureView的显示来达到目的,设置预览方向.
./packages/apps/Camera2/src/com/android/camera/one/v2/OneCameraImpl.java:400: builder.set(CaptureRequest.JPEG_ORIENTATION,
./packages/apps/Camera2/src/com/android/camera/one/v2/SimpleOneCameraFactory.java:199: rootBuilder.setParam(CaptureRequest.JPEG_ORIENTATION,
./packages/apps/Camera2/src/com/android/camera/one/v2/OneCameraZslImpl.java:824: builder.set(CaptureRequest.JPEG_ORIENTATION,
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);}
关于Camera拍照生成图片角度处理
利用Camera拍照时,读取图片数据存储为图片,取到的数据直接来源于图像传感器采集到的图像数据.
所以拍摄生成图片的角度还是和默认图片传感器方向一致.
可以利用代码修改—拍摄生成图片的角度.
Camera2 API – 通过CaptureRequest.JPEG_ORIENTATION来设置拍照的图像方向
修改生成图片镜像
Android 7.1 RK3288 A40i Camera2 拍照镜像分析
./packages/apps/Camera2/src/com/android/camera/PhotoModule.javavoid saveFinalPhoto(final byte[] jpegData, final ExifInterface exif, CameraProxy camera) {if (mNamedImages == null)mNamedImages = new NamedImages();if (mNamedImages.mQueue.size() == 0)mNamedImages.nameNewImage(System.currentTimeMillis());int orientation = Exif.getOrientation(exif);float zoomValue = 1.0f;if (mCameraCapabilities.supports(CameraCapabilities.Feature.ZOOM)) {zoomValue = mCameraSettings.getCurrentZoomRatio();}...exif.setTag(directionRefTag);exif.setTag(directionTag);}+ //add text
+ Bitmap bitmap = CameraUtil.makeBitmap(jpegData, exifWidth * exifHeight);//jpeg byte 数组转换为bitmap
+ Matrix matrix = new Matrix();
+ matrix.postScale(-1, 1);//利用matrix 对矩阵进行转换 x轴镜像
+ bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//重新转换为 .jpeg 数据
+ byte [] tm_jpegData = baos.toByteArray();
+ //add text
+onMediaSavedListenerAfterBurstCapture mediaSavedListener = new onMediaSavedListenerAfterBurstCapture((mBurstPictureLength - mIndex));getServices().getMediaSaver().addImage(
- jpegData, title, date, mLocation, width, height,
+ tm_jpegData, title, date, mLocation, width, height,orientation, exif, mediaSavedListener);}// Animate capture with real jpeg data instead of a preview
Android9.0 Camera2 横屏问题修改记录
Android Camera预览角度和拍照保存图片角度学习
修改摄像头旋转方向
可以驱动层,hal层,framework层,app层修改.
--- a/frameworks/base/core/java/android/hardware/Camera.java
+++ b/frameworks/base/core/java/android/hardware/Camera.java
@@ -399,7 +399,7 @@ public class Camera {* @see android.app.admin.DevicePolicyManager#getCameraDisabled(android.content.ComponentName)*/public static Camera open(int cameraId) {
- return new Camera(cameraId);
+ return rotateCamera(i);}/**public static Camera open() {int numberOfCameras = getNumberOfCameras();CameraInfo cameraInfo = new CameraInfo(); for (int i = 0; i < numberOfCameras; i++) {getCameraInfo(i, cameraInfo);if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
- return new Camera(i);
+ return rotateCamera(i);}}return null;}+ //add text
+ private static Camera rotateCamera(int cameraId) {
+ Camera camera = new Camera(cameraId);
+ Parameters parameters = camera.getParameters();
+ CameraInfo cameraInfo = new CameraInfo();
+ getCameraInfo(cameraId, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {//0 后置
+ camera.setDisplayOrientation(270);
+ parameters.setRotation(270);
+ } else if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {// 1 前置
+ camera.setDisplayOrientation(90);
+ parameters.setRotation(90);
+ }
+ camera.setParameters(parameters);
+ return camera;
+ }
+ //add text
+
修改某个apk应用拿到的SENSOR_ORIENTATION方向,影响Camera拍照生成图片角度.
frameworks/base/core/java/android/hardware/camera2/CameraCharacteristics.java@PublicKey@NonNullpublic static final Key<Integer> SENSOR_ORIENTATION =new Key<Integer>("android.sensor.orientation", int.class);@Nullablepublic <T> T get(Key<T> key) {//add text Log.d("tag", "Activity name: " + ActivityThread.currentActivityThread().currentActivityName() + " ,key = " + key);if(key != null && SENSOR_ORIENTATION.equals(key)){if(ActivityThread.currentOpPackageName().contains("com.xxx")){//String cameraId = CameraManager.getCameraId();if(cameraId != null){T value = (T)(Object)90;Log.d("tag", "value = " + value + " ,ori = " + mProperties.get(key));return value;}}//add text return mProperties.get(key);}
三方Camera App Framework方向控制(API2)
改变摄像头成像方向
camera3_profiles_rk356x.xml,这个配置说明了这个板子所有支持的摄像头配置.
RK 硬件的camera配置文件中找到ov8858摄像头设备,并修改其sensor.orientation value 的值.
hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml
<Profiles cameraId="0" name="ov8858" moduleId="m00"><Supported_hardware><hwType value="SUPPORTED_HW_RKISP1"/></Supported_hardware>...<!-- Sensor --><sensor.orientation value="270"/><!-- Sensor -->
rk356x OpenCamera流程浅析
相关文章:
Android Camera 预览角度和拍照保存图片角度相关
–基于Android R(11) 关于Camera Camera Framework 的架构 Android Camera Framework 是一个分层架构,由以下组件组成: HAL(硬件抽象层): HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.CameraService : Camera…...
新手如何使用Qt——方法使用
前言 那么这篇文章其实是我在使用Qt的过程当中呢,我发现在Qt使用过程中,在我理解信号和槽这个概念后,在编写槽函数数的时候,发现了自身存在的问题,我的难点是在于当我在编写槽函数的时候,我知道这个槽函数是…...
友元运算符重载函数
目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 (1)在类的内部,定义友元运算符重载函数的格式如下: friend 函数类型 operator 运算符(形参表&a…...
从0开始实现es6 promise类
主要由基础实现和静态类的实现两部分组成。 1 基础实现(不含静态类) 1.1 使用类实现完成构造函数 实现代码如下,构造函数传入一个回调函数,定义resolve和reject函数,将两个函数作为参数执行回调函数。 // 1. 使用类实…...
XML 编码
XML 编码 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它由万维网联盟(W3C)开发,旨在提供一种标准的方式来结构化、存储和传输数据。XML的设计目标是既易于人类阅读,也易于机器解析。 XML的…...
AI周报(9.22-9.28)
AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机,旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法,能够自动识别和分析家中宠物的行为,并提供定制化的护理建议。 SiiPet相机的核心功…...
基于RealSense D435相机实现手部姿态重定向
基于Intel RealSense D435相机和MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向,获取手部的6D坐标(包括位置和姿态)。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&…...
js中防抖 debounce 节流 throttle 原理 从0手动实现
1 防抖 高频触发事件时,执行损耗高的操作,连续触发过程中,只执行最后一次。 高频事件:input scroll resize等。损耗高:网络请求、dom操作。 实现防抖步骤:1.在回调函数中判断timer是否存在,存在…...
AIGC: 10 AI转文服务器的搭建过程记录
上图是台风席卷城市,现在企业的服务基本都是混合部署,云计算厂商的机房往往可以提供比较好的保护,一般在地下,扛多少级地震,扛多少级台风,而自建机房,往往写字楼经常停电,网络运营上…...
性能测试1初步使用Jmeter
当你看到这边文章的时候,详细你已经知道啥是性能测试,以及也听说过Jmeter了,所以不过多介绍,这里,只是帮助你快速的使用Jmeter来测试接口。 1获取安装包 官网下载地址:https://jmeter.apache.org/downloa…...
OpenGL ES 绘制一个三角形(2)
OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统,使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里,三角形是一个基础图形,其他的图形都可以使用三角形拼接而成,所以我们就的案例就基于这个开始。 在Android系统中…...
QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红
问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…...
初试React前端框架
文章目录 一、React概述二、React核心特性1、组件化设计2、虚拟DOM3、生态系统 三、实例操作1、准备工作2、创建项目结构3、启动项目4、编写React组件5、添加React样式6、运行项目,查看效果 四、实战小结 一、React概述 大家好,今天我们将一起探索React…...
华为OD机试真题---手机App防沉迷系统
题目概述 智能手机在方便我们生活的同时,也侵占了大量时间。手机App防沉迷系统旨在帮助用户合理规划手机App使用时间,确保在正确的时间做正确的事。系统的主要功能包括: 在一天24小时内,可注册每个App的允许使用时段。一个时段只…...
物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程
一、前言 物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程 1、软件为绿色免安装版,解压即可使用,已经内置数据库,不需再安装。 2、软件下载可以到本文章最后点击官网卡片下。 二、软件程序教程 1、如图,…...
代码随想录算法训练营| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树
找树左下角的值 题目 参考文章 思路:这里寻找最左下角的值,其实用前中后序都是可以的,只要保证第一遍历的是左边开始就可以。设置Deep记录遍历的最大深度,deep记录当前深度。当遇到叶子节点时而且当前深度比最大深度还大则更换最…...
【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)
博主说明:本文项目编号 T 054 ,文末自助获取源码 \color{red}{T054,文末自助获取源码} T054,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
人工智能与自然语言处理发展史
前言 在科技的浪潮中,人工智能 (AI) 作为一股不可阻挡的力量,持续推动着社会与科技的进步。本博客旨在深入剖析人工智能及其核心领域——神经网络、自然语言处理、统计语言模型、以及大规模语言模型——的演进历程,以专业的视角展现这一领域…...
0基础跟德姆(dom)一起学AI 机器学习01-机器学习概述
【知道】人工智能 - Artificial Intelligence 人工智能 - AI is the field that studies the synthesis and analysis of computational agents that act intelligently - AI is to use computers to analog and instead of human brain - 释义 - 仿智; 像人…...
yakit使用教程(一,下载并进行基础配置)
一,yakit简介 YAKIT(Yet Another Knife for IT Security)是一款网络安全单兵工具,专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具,例如密码破解工具、网络扫描器、漏洞利用工具等,帮…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
