自定义相机那些坑之预览界面适配及原理

Android自定义相机:拍摄照片不存到手机,只获取照片数据(可预览重拍等) 先上效果图: 1. 声明相机权限以及注册相关Activity <application ... > <activity android:name=".MyCameraActivity" android:theme="@style/AppTheme.NoActionBarFullScreen" /&g... 阅读详情

0.思维导图

1.问题的产生

当Activity的oritation设置为portrait时,前置/后置摄像头预览图像会逆时针旋转90度展示,如图:

2.问题产生的本质

相机图像数据来自图像感应器(物理器件)(Image Sensor),图像感应器再将数据输出到预览Window上时,图像感应器有一个读取图像的方向,并且不会改变。这个读取的方向通过CameraInfo的orientation可以获取。现在的图像感应器硬件的读取方向都是顺时针90度,即读取方向如下图:

由此就会产生预览方向逆时针旋转90度。具体的产生过程如图:

3.官方推荐的解决方案

    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);
  }

推荐的解决方案中:
(1)CameraInfo是实例化的相机类,其中orientation是相机(图像感应器)相对于自然坐标系(即左上角坐标系)的旋转角度数.
(2)rotation是预览window的旋转的方向,当Activity的 screenOrientation="portrait"时,rotation=0,也就是没有旋转,当 screenOrientation="landscape"时,rotation=1。
(3)camera.setDisplayOrientation(int param)根据官方解释就是图片已经输出后旋转的度数。旋转值可以是 0, 90, 180, and 270. (a)当打开后置摄像头,Window竖屏显示时,预览图像旋转: result=(90-0+360)%360=90,顺时针旋转90度.
(b)当打开后置摄像头,Window横屏显示时,预览图像旋转: result=(90-90+360)%360=0,顺时针旋转0度.
(c)前置摄像头有一些特殊情况,在下面会谈到。
(d)param的参数官方解释 @param degrees the angle that the picture will be rotated clockwise.Valid values are 0, 90, 180, and 270.

4.一些存在的问题

1、对于前后摄像头,图像感应器输出的方向是一致的,并不像部分博客所说进行了镜像。
2、CameraInfo中的facing字段,无论是调用前置摄像头还是后置摄像头,facing均为0,即后置摄像头值。如下图各种机型返回值:

5.参考相关文档

腾讯Bugly: https://blog.youkuaiyun.com/Tencent_Bugly/article/details/53375311 http://hao.caibaojian.com/16047.html
Demo: https://github.com/xionglei12/camera-preview-demo.git

仿照手机相机做的一个H5端自定义相机 h5端的一个自定义手机拍照,不是直接全屏调用手机里自带的照相机,用户可以直接用getUserMedia获得摄像头提供的视频流。 调取本地视频或音频设备的接口,出于安全的考虑,只能在localhost或者https下使用 立即下载

相关推荐

自定义相机

自己控制相机,不是调用系统的相机进行获得图片

数据处理语言numpy pandas matplotlib

目录NumPy0.一些不严谨的感觉1.NumPy Ndarray 对象2.NumPy 数据类型3.NumPy 数组属性4.NumPy 创建数组5.NumPy 从已有的数组创建数组6.NumPy 从数值范围创建数组7.NumPy 切片和索引8.NumPy 高级索引9.NumPy 广播(Broadcast)10.NumPy 迭代数组♥11.Numpy 数组操作12.NumPy 位运算13.NumPy 字符串函数♥14.NumPy 数学函数♥15.NumPy 算术函数♥16.NumPy 统计函数17.NumPy

孟孟单单的博客 893

iOS手持证件照相机:【拍身份证裁剪大小,截图截出所需大小】(带拍摄区域边框及半透明遮罩层)

原理文章:https://kunnan.blog.youkuaiyun.com/article/details/112311308 手持证件照的裁剪算法:根据图片方向进行裁剪) 屏幕适配:为了避免框框视图的frame超出视图范围,导致半透明黑色遮罩无法渲染maskLayer;框框视图的布局采取宽为屏幕宽度,高按照比例进行计算

matplotlib基础

matplotlib基本用法 一、Matplotlib基础知识 1.绘制一条曲线图 import matplotlib.pyplot as plt %matplotlib inline import numpy as np import pandas as pd from pandas import Series,DataFrame # 1、可以使用多个plot函数(推荐),在一个图中绘制多个曲线...

pythoncsdn111的博客 644

java调用第三方api接口获取数据

弊端,但是并不是每个接口都适用于这套模板,之前写的接口不适用,都是在这个模板里做了定制处理(if 特殊表 -》处理),需要考虑兼容之前的代码,这种兼容代码,有风险会改掉之前的逻辑个人喜欢,有一个接口,写一段代码灵活自由些。2.还有一部分是对post请求的返回数据,做处理,因为json返回的格式如果双方没有约定好,里面数据是多层json嵌套,需要做处理。江同事交接的就是这个代码模板,可以看下源码调试一下,之前交接的视频,也可以看下,主要还是看代码理解快些,将 写好的代码达成jar包,上传到linux上去,

随风不随水的博客 2036

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 318

plt.xticks()

plt.xticks([0,1],[1,2],rotation=0) [0,1]代表x坐标轴的0和1位置,[2,3]代表0,1位置的显示lable,rotation代表lable显示的旋转角度。 官方给出的例子是: xticks( arange(5), (‘Tom’, ‘Dick’, ‘Harry’, ‘Sally’, ‘Sue’) ) 用’Tom’, ‘Dick’, ‘Harry’, ‘Sally’, 'Sue’作为[0,1,2,3,4]位置显示的label。 转载自:https://blog.csdn.

banxia优快云的博客 4895

神联动:LSTM+卡尔曼滤波!一区大门轻松开!

近来热度飙升,成为时间序列预测和状态估计等领域的香饽饽,非常好发高区!主要在于:这两者结合,不仅能提高模型预测准确性;还能拓展应用场景,为我们的论文创新提供发挥空间,且当下还在蓝海阶段,还不算卷。具体点说:卡尔曼滤波擅长处理线性状态估计和噪声,能使LSTM更好地适应动态环境的变化,减少噪声干扰,降低预测误差。而LSTM通过捕捉长期依赖关系,擅长处理非线性时间序列,能够弥补卡尔曼滤波在这方面的不足,从而把应用场景从传统的状态估计,延伸到金融预测、工业检测、自动驾驶等任务。

2401_82426425的博客 2209

plt.xticks中的参数代表的含义与scatter等函数中的变量的意义

plt.xticks([0,1],[1,2],rotation=0) [0,1]代表x坐标轴的0和1位置,[2,3]代表0,1位置的显示lable,rotation代表lable显示的旋转角度。 values=data[‘values’] plt.scatter(values[:,0],values[:,2],marker=‘o’)#以数据的第零列做x轴,第三列做y轴,来描绘散点图 ...

少猿的博客 1万+

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 282

【人工智能】OpenClaw网关API速率限制报错全解析 API rate limit reached. Please try again later.

对应HTTP标准状态码为429(请求过多)。该报错集中出现在OpenClaw GATEWAY DASHBOARD的聊天会话界面,核心特征为:用户最初以为是单一模型服务商的问题,先后更换OpenAI、Gemini、Ollama、Moonshot、Mercury-2等多个主流大模型API后,该报错仍稳定触发,尤其在执行复杂任务时高频出现。

奶爸的编程之路,也就一周冷个三天 6459

matplotlib.collections、(二)

class matplotlib.collections.AsteriskPolygonCollection(numsides, rotation=0, sizes=(1, ), **kwargs)[source] Bases: matplotlib.collections.RegularPolyCollection Draw a collection of regular asterisks...

weixin_36670529的博客 1717

Power EM与Signal EM解决办法与原理分析

1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有power EM问题,可以叠加多层线和垂直方向补power形成网络降低并联电阻和提供更多电流通路解决,这种方法还可以降低ir drop。3.先进工艺有一个via ladder的方法可以解决power/signal em问题,clock cell出pin绕线或者power rail连接power stripe通过搭梯子的方式连接,原理还是分流。

m0_61544122的博客 4746

Android相机预览设置适配及显示方式

Android相机的部分工作原理。预览流程相机预览是Android Camera最常用的功能之一,它是很多功能重要的输入,例如扫码、AR等。一般而言,相机预览的整体流程,可以通过下图表示:...

淘系技术 3678

论文阅读:2024 ACM CCS “Do Anything Now”: Characterizing and Evaluating In-The-Wild Jailbreak Prompts on

大语言模型(LLMs)的滥用问题引起了公众和大语言模型供应商的高度关注。有一种特殊的对抗性提示,叫做越狱提示,它已成为绕过防护措施、让大语言模型生成有害内容的主要攻击手段。在这篇论文中,作者使用新框架JailbreakHub,对2022年12月至2023年12月期间的1405个越狱提示进行了全面分析。作者识别出131个越狱提示社区,发现了越狱提示的独特特征以及主要攻击策略,比如提示注入和权限提升。

CSPhD-winston的博客 1414

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

L2CAP(逻辑链路控制与适配协议)是蓝牙协议栈中的核心层,位于基带层之上,为上层协议提供数据传输服务。在低功耗蓝牙(BLE)中,L2CAP面向连接信道(Connection-Oriented Channel, CoC) 是实现可靠数据传输的关键机制,广泛应用于健康监测、智能家居、工业控制等领域。

byte轻骑兵的技术小窝 3634

鸿蒙折叠 PC 相机预览画面旋转异常解决方案:原理分析与实战落地

鸿蒙折叠 PC 相机预览画面旋转异常,是设备动态特性与相机固定配置不匹配导致的典型问题,其核心解决思路并非复杂的画面变换,而是建立相机与屏幕的角度实时同步机制。本文通过「获取屏幕旋转角度→配流后设置预览旋转→监听屏幕变化动态更新」的核心流程,从原理到实战实现了问题的彻底解决,核心代码仅需在相机会话配流后调用setPreviewRotation()方法,并结合屏幕旋转监听完成动态适配,开发成本低且效果显著。

m0_59315734的博客 1230

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android相机开发终极指南:AutoFitSurfaceView自动适配技术详解

在Android相机应用开发中,实现完美的预览界面适配一直是开发者面临的挑战。camera-samples项目中的AutoFitSurfaceView技术提供了优雅的解决方案,让相机预览能够智能适应不同屏幕尺寸和方向。 ## 什么是AutoFitSurfaceView?🤔 AutoFitSurfaceView是Android相机开发中的一个自定义SurfaceView组件,专门用于解决相机预

gitblog_00100的博客 1127

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

鸿蒙常见问题分析:自定义相机预览界面有黑边

摘要: HarmonyOS自定义相机开发中,XComponent组件预览界面边缘常出现黑边问题,影响用户体验。该问题源于setXComponentSurfaceRect接口中offsetX/offsetY参数的误用,导致Surface未完全覆盖XComponent区域,露出背景色。解决方案包括:1)确保offsetX/offsetY为0;2)动态匹配Surface与相机预览流的宽高比;3)多设备适配优化。文章通过技术原理分析、完整代码示例及常见问题解答,指导开发者实现无黑边的全屏预览,并扩展至多相机、AR等

m0_59315734的博客 155

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

鸿蒙 PC 相机开发:折叠屏旋转适配与预览流处理实战

本文提供的代码实现已封装为可复用的工具类,可直接集成到鸿蒙 PC 相机应用开发中,同时遵循鸿蒙系统的开发规范与硬件特性。通过以上方案,可确保鸿蒙 PC 折叠屏在任意屏幕旋转形态、任意相机使用场景下,预览画面始终正向显示,兼顾应用的适配性、性能与稳定性。

m0_59315734的博客 327

OpenGL ES for Android 相机预览适配不同分辨率的手机

上一篇讲到相机预览,相机的预览分辨率设置为1280*720,大家有没有想过如果将GLSurfaceView设置为正方形会如何?很明显画面会被拉伸导致变形,在想一下如果设置GLSurfaceView为全屏,但目前市场上的手机有很多种不同的分辨率,尤其是全面屏、折叠屏屏,这些手机并不是常见的16:9的手机,因此我们需要适配这些不同分辨率的手机​。 ​有的同学可能可能会想根据不同分辨率的手机而设置不同...

老孟Flutter 2204

HarmonyOS 6学习:相机预览画面拉伸全解析——告别变形,打造完美相机预览体验

《HarmonyOS相机预览画面拉伸问题解决方案》 本文针对HarmonyOS相机应用开发中常见的预览画面拉伸问题,提出了一套完整的解决方案。当预览流与输出流分辨率宽高比不一致时,系统会自动进行非等比缩放,导致预览画面出现"哈哈镜"式的变形效果。文章首先分析了问题现象及其影响范围,然后深入剖析了技术原理,指出问题的核心在于预览流、输出流和XComponent三者的宽高比不匹配。 解决方案分为三个关键步骤:1)获取设备支持的相机分辨率;2)动态计算并设置与屏幕宽高比匹配的最佳预览参数;3)

nashane的博客 668

鸿蒙5.0&next开发【相机预览花屏解决方案】媒体开发

开发者在[使用相机服务]时,如果仅用于预览流展示,通常使用[XComponent]组件实现,如果需要获取每帧图像做二次处理(例如获取每帧图像完成二维码识别或人脸识别场景),可以通过[ImageReceiver]中imageArrival事件监听预览流每帧数据,解析图像内容。在解析图像内容时,如果未考虑stride,直接通过使用width*height读取图像内容去解析图像,会导致相机预览异常,从而出现相机预览花屏的现象。

zhenggaoxiao232的博客 1187

终极指南:CameraView如何通过OpenGL实现高性能相机预览

CameraView是一个功能强大的Android相机库,它通过OpenGL技术实现了高性能的相机预览功能。本文将详细介绍CameraView如何利用OpenGL的强大能力,为开发者提供流畅、高效的相机预览体验,同时支持实时滤镜、手势控制等高级功能。 ## CameraView的OpenGL预览架构解析 CameraView的高性能预览核心在于其基于OpenGL的渲染架构。在`GlCamera

gitblog_01171的博客 1020

鸿蒙5.0 APP开发案例分析:相机预览花屏解决方案

开发者在 使用相机服务 时,如果仅用于预览流展示,通常使用 XComponent 组件实现,如果需要获取每帧图像做二次处理(例如获取每帧图像完成二维码识别或人脸识别场景),可以通过 ImageReceiver 中imageArrival事件监听预览流每帧数据,解析图像内容。在解析图像内容时,如果未考虑stride,直接通过使用width*height读取图像内容去解析图像,会导致相机预览异常,从而出现相机预览花屏的现象。

mn_xiaona666的博客 1030

连载 | Android之Camera1实现相机开发

一、前言 现在很多app都会有拍照功能,一般调用系统进行拍照裁剪就能满足平时的需求,但有些场景或者特殊情况下如:持续不间断拍多张照片或者是进行人脸识别的时候,这时候之间调用系统原生相机拍照时不能满足自己的开发需求,就需要使用原生Camera来进行自定义开发,本文会采用android.hardware.CameraAPI来进行开发。在Android生态中,Camera是碎片化较为严重的一块,因为现在...

深红骑士的博客 3938
上一篇: java序列化的作用和反序列化
下一篇: 插件化基础知识之一:AndroidManifest的解析
FullStackDeveloper
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值