当前位置: 首页 > news >正文

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 是一个分层架构&#xff0c;由以下组件组成&#xff1a; HAL&#xff08;硬件抽象层&#xff09;: HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.CameraService : Camera…...

新手如何使用Qt——方法使用

前言 那么这篇文章其实是我在使用Qt的过程当中呢&#xff0c;我发现在Qt使用过程中&#xff0c;在我理解信号和槽这个概念后&#xff0c;在编写槽函数数的时候&#xff0c;发现了自身存在的问题&#xff0c;我的难点是在于当我在编写槽函数的时候&#xff0c;我知道这个槽函数是…...

友元运算符重载函数

目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 &#xff08;1&#xff09;在类的内部&#xff0c;定义友元运算符重载函数的格式如下&#xff1a; friend 函数类型 operator 运算符&#xff08;形参表&a…...

从0开始实现es6 promise类

主要由基础实现和静态类的实现两部分组成。 1 基础实现&#xff08;不含静态类&#xff09; 1.1 使用类实现完成构造函数 实现代码如下&#xff0c;构造函数传入一个回调函数&#xff0c;定义resolve和reject函数&#xff0c;将两个函数作为参数执行回调函数。 // 1. 使用类实…...

XML 编码

XML 编码 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它由万维网联盟&#xff08;W3C&#xff09;开发&#xff0c;旨在提供一种标准的方式来结构化、存储和传输数据。XML的设计目标是既易于人类阅读&#xff0c;也易于机器解析。 XML的…...

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机&#xff0c;旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法&#xff0c;能够自动识别和分析家中宠物的行为&#xff0c;并提供定制化的护理建议。 SiiPet相机的核心功…...

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435相机和MediaPipe的手部姿态检测&#xff0c;进一步简单实现手部姿态与机器人末端的重定向&#xff0c;获取手部的6D坐标&#xff08;包括位置和姿态&#xff09;。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&…...

js中防抖 debounce 节流 throttle 原理 从0手动实现

1 防抖 高频触发事件时&#xff0c;执行损耗高的操作&#xff0c;连续触发过程中&#xff0c;只执行最后一次。 高频事件&#xff1a;input scroll resize等。损耗高&#xff1a;网络请求、dom操作。 实现防抖步骤&#xff1a;1.在回调函数中判断timer是否存在&#xff0c;存在…...

AIGC: 10 AI转文服务器的搭建过程记录

上图是台风席卷城市&#xff0c;现在企业的服务基本都是混合部署&#xff0c;云计算厂商的机房往往可以提供比较好的保护&#xff0c;一般在地下&#xff0c;扛多少级地震&#xff0c;扛多少级台风&#xff0c;而自建机房&#xff0c;往往写字楼经常停电&#xff0c;网络运营上…...

性能测试1初步使用Jmeter

当你看到这边文章的时候&#xff0c;详细你已经知道啥是性能测试&#xff0c;以及也听说过Jmeter了&#xff0c;所以不过多介绍&#xff0c;这里&#xff0c;只是帮助你快速的使用Jmeter来测试接口。 1获取安装包 官网下载地址&#xff1a;https://jmeter.apache.org/downloa…...

OpenGL ES 绘制一个三角形(2)

OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统&#xff0c;使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里&#xff0c;三角形是一个基础图形&#xff0c;其他的图形都可以使用三角形拼接而成&#xff0c;所以我们就的案例就基于这个开始。 在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、运行项目&#xff0c;查看效果 四、实战小结 一、React概述 大家好&#xff0c;今天我们将一起探索React…...

华为OD机试真题---手机App防沉迷系统

题目概述 智能手机在方便我们生活的同时&#xff0c;也侵占了大量时间。手机App防沉迷系统旨在帮助用户合理规划手机App使用时间&#xff0c;确保在正确的时间做正确的事。系统的主要功能包括&#xff1a; 在一天24小时内&#xff0c;可注册每个App的允许使用时段。一个时段只…...

物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程

一、前言 物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程 1、软件为绿色免安装版&#xff0c;解压即可使用&#xff0c;已经内置数据库&#xff0c;不需再安装。 2、软件下载可以到本文章最后点击官网卡片下。 二、软件程序教程 1、如图&#xff0c;…...

代码随想录算法训练营| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树

找树左下角的值 题目 参考文章 思路&#xff1a;这里寻找最左下角的值&#xff0c;其实用前中后序都是可以的&#xff0c;只要保证第一遍历的是左边开始就可以。设置Deep记录遍历的最大深度&#xff0c;deep记录当前深度。当遇到叶子节点时而且当前深度比最大深度还大则更换最…...

【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 054 &#xff0c;文末自助获取源码 \color{red}{T054&#xff0c;文末自助获取源码} T054&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

人工智能与自然语言处理发展史

前言 在科技的浪潮中&#xff0c;人工智能 (AI) 作为一股不可阻挡的力量&#xff0c;持续推动着社会与科技的进步。本博客旨在深入剖析人工智能及其核心领域——神经网络、自然语言处理、统计语言模型、以及大规模语言模型——的演进历程&#xff0c;以专业的视角展现这一领域…...

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 - 释义 - 仿智&#xff1b; 像人…...

yakit使用教程(一,下载并进行基础配置)

一&#xff0c;yakit简介 YAKIT&#xff08;Yet Another Knife for IT Security&#xff09;是一款网络安全单兵工具&#xff0c;专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具&#xff0c;例如密码破解工具、网络扫描器、漏洞利用工具等&#xff0c;帮…...

全面解析数据库锁机制:从行锁到死锁的深度剖析

锁是数据库并发控制的核心机制&#xff0c;也是面试中绕不开的高频考点。很多开发者对锁的理解停留在“加锁就行了”&#xff0c;但遇到死锁、锁等待超时、性能骤降等问题时往往束手无策。本文将系统讲解数据库锁的分类、实现原理、锁与事务隔离级别的关系&#xff0c;并结合 M…...

Sketchfab模型下载完整方案:3个核心技巧获取精美3D资源

Sketchfab模型下载完整方案&#xff1a;3个核心技巧获取精美3D资源 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 如果你经常在Sketchfab上发现惊艳的3D模型却无法…...

Windows用户福音:WSL2+Docker快速部署Coze Studio开源版(附常见错误解决方案)

Windows平台高效部署Coze Studio开源版的完整指南 对于Windows开发者而言&#xff0c;在本地环境搭建Coze Studio开源版可能面临诸多挑战。本文将提供一套经过验证的完整解决方案&#xff0c;从WSL2配置到Docker优化&#xff0c;帮助您避开常见陷阱&#xff0c;快速实现Coze St…...

多无人机协同避障之自适应重构 V 型编队与分布式控制算法探索

多无人机 协同避障 自适应重构v型编队 分布式控制算法 包含参考文献和完整代码 #无人机 #协同避障 #重构队形 #分布式控制 #自适应重构编队在无人机应用领域&#xff0c;多无人机协同作业已成为研究热点。其中&#xff0c;协同避障以及自适应重构编队是实现高效任务执行的关键技…...

解决WSL2和Hyper-V网络冲突:最新镜像模式+防火墙配置指南

解决WSL2与Hyper-V网络冲突的终极方案&#xff1a;镜像模式与防火墙深度配置 在Windows系统上同时运行WSL2和Hyper-V虚拟机时&#xff0c;网络冲突问题几乎成为每个开发者的必经之路。想象一下这样的场景&#xff1a;当你正在调试一个分布式系统&#xff0c;WSL2中的微服务需要…...

SCRFD实战:从数据标注到模型训练的全流程指南

1. SCRFD算法基础与场景适配 SCRFD作为轻量级人脸检测算法&#xff0c;最初设计用于输出人脸矩形框及5个关键点&#xff08;左右眼、鼻尖、嘴角&#xff09;。但在工业质检、医疗影像等领域&#xff0c;我们常需要检测其他目标并调整关键点数量。比如检测电路板元件需要3个定位…...

手机号查询QQ技术解析与实战指南

手机号查询QQ技术解析与实战指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 问题&#xff1a;数字化时代的身份关联困境 在现代社会&#xff0c;手机号与QQ号作为重要的数字身份标识&#xff0c;其关联查询需求日益凸显。当用户…...

STM32CubeIDE实战:HAL库串口中断接收的5个常见坑点及解决方案

STM32CubeIDE实战&#xff1a;HAL库串口中断接收的5个常见坑点及解决方案 在工业传感器数据采集、设备间通信等场景中&#xff0c;稳定可靠的串口通信往往是嵌入式开发的关键环节。许多开发者在使用STM32CubeIDE配合HAL库实现串口中断接收时&#xff0c;虽然能够快速搭建基础功…...

基于LFM2.5-1.2B-Thinking-GGUF的Java面试题智能生成与解析系统

基于LFM2.5-1.2B-Thinking-GGUF的Java面试题智能生成与解析系统 1. 解决Java面试准备的痛点 对于Java开发者来说&#xff0c;面试准备往往是个耗时费力的过程。传统的刷题方式存在几个明显问题&#xff1a;一是题库更新慢&#xff0c;跟不上技术发展&#xff1b;二是题目质量…...

从CVE-2023-3450看锐捷RG-BCR860路由器:一次网络诊断功能引发的命令注入实战剖析

1. 漏洞背景与设备介绍 锐捷RG-BCR860是面向中小型商业场景设计的云路由器&#xff0c;主打简单易用的中文Web管理界面。这款设备常见于连锁餐饮、快捷酒店等需要稳定网络环境的场所&#xff0c;最大支持150台终端同时接入。作为一款商用设备&#xff0c;它内置了安全审计模块和…...