Android Camera2 Image

Android多媒体功能开发(14)——Camera2框架 Camera2框架的相机模型被设计成一个管道,使用相机时需要先和相机设备建立一个会话,通过该会话向相机发送请求,相机将图像数据保存到配置好的Surface,Surface就是存放图像数据的缓冲区。请求分为单次请求、重复请求和多次请求三种。 阅读详情

一、Image概述

android.media.Image

与 MediaCodec 或 CameraDevice 等媒体源一起使用的单个完整图像缓冲区。
此类允许应用程序通过一个或多个 ByteBuffer 高效地直接访问图像的像素数据。 每个缓冲区都封装在 Image.Plane 中,描述该平面中像素数据的布局。 由于这种直接访问,与 Bitmap 类不同,图像不能直接用作 UI 资源。
由于图像通常由硬件组件直接生成或消耗,因此它们是整个系统共享的有限资源,一旦不再需要就应立即关闭。
例如,当使用 ImageReader 类从各种媒体源读取图像时,一旦达到最大未完成图像计数,不关闭旧的 Image 对象将阻止新图像的可用性。 发生这种情况时,获取新图像的函数通常会抛出 IllegalStateException。

二、方法

/**

获取该图像的格式。 该格式决定了表示图像所需的 ByteBuffer 的数量,以及每个 ByteBuffer 中像素数据的总体布局。
格式是 ImageFormat 中的值之一。 格式和平面之间的映射如下:
格式 

平面数

布局细节
JPEG
1
压缩数据,因此行和像素步长为 0。要解压缩,请使用 BitmapFactory#decodeByteArray。
YUV_420_888
3
亮度平面后跟 Cb 和 Cr 色度平面。 色度平面的宽度和高度是亮度平面的一半(4:2:0 子采样)。 每个平面中的每个像素样本都有 8 位。 每个平面都有自己的行跨距和像素跨距。
YUV_422_888
3
亮度平面后跟 Cb 和 Cr 色度平面。 色度平面的宽度和高度是亮度平面的一半(4:2:2 子采样)。 每个平面中的每个像素样本都有 8 位。 每个平面都有自己的行跨距和像素跨距。
YUV_444_888
3
亮度平面后跟 Cb 和 Cr 色度平面。 色度平面与亮度平面具有相同的宽度和高度(4:4:4 子采样)。 每个平面中的每个像素样本都有 8 位。 每个平面都有自己的行跨距和像素跨距。
FLEX_RGB_888
3
R(红色)平面,后面是 G(绿色)和 B(蓝色)平面。 所有平面都具有相同的宽度和高度。 每个平面中的每个像素样本都有 8 位。 每个平面都有自己的行跨距和像素跨距。
FLEX_RGBA_8888
4
R(红色)平面,后面是 G(绿色)、B(蓝色)和 A(alpha)平面。 所有平面都具有相同的宽度和高度。 每个平面中的每个像素样本都有 8 位。 每个平面都有自己的行跨距和像素跨距。
RAW_传感器
1
原始传感器图像数据的单个平面,每个颜色样本 16 位。 布局的详细信息需要从原始传感器数据的来源查询,例如CameraDevice。
RAW_PRIVATE
1
私有布局的原始传感器图像数据的单个平面。 布局的细节是特定于实现的。 此格式未定义行跨距和像素跨距。 在 RAW_PRIVATE 图像上调用 Image.Plane.getRowStride() 或 Image.Plane.getPixelStride() 将导致抛出 UnSupportedOperationException。
HEIC
1
压缩数据,因此行和像素步长为 0。要解压缩,请使用 BitmapFactory#decodeByteArray。
YCBCR_P010
1
P010 是 4:2:0 YCbCr 半平面格式,由 WxH Y 平面和后面的 Wx(H/2) CbCr 平面组成。 每个样本都由一个 16 位小端值表示,其中低 6 位设置为零。

*/

public abstract int getFormat();

/**

图像的宽度(以像素为单位)。

对于对某些颜色通道进行二次采样的格式,这是最大分辨率平面的宽度。

*/

public abstract int getWidth();

/**

图像的高度(以像素为单位)。 对于对某些颜色通道进行二次采样的格式,这是最大分辨率平面的高度。

*/

public abstract int getHeight();

/**

获取与该帧关联的时间戳。
时间戳以纳秒为单位,通常单调递增。 来自不同来源的图像的时间戳可能具有不同的时基,因此可能不具有可比性。 时间戳的具体含义和时基取决于提供图像的来源。 有关更多详细信息,请参阅 Camera、CameraDevice、MediaPlayer 和 MediaCodec。

*/

public abstract long getTimestamp();

/**

获取与此框架关联的 SyncFence 对象。
在通过 ImageWriter.dequeueInputImage() 从 ImageWriter 出列的图像上执行 getPlanes() 后,此函数返回无效的 SyncFence。
Return:
此框架的 SyncFence。
Throw:
IOException – 如果 SyncFence 对象返回时出现错误。

*/

public @NonNull SyncFence getFence() throws IOException

/**

使用此框架设置栅栏文件描述符。
Param:
fence – 为此帧设置的 fence 文件描述符。
Throw:
IOException – 如果设置 SyncFence 时出现错误。

*/

public void setFence(@NonNull SyncFence fence) throws IOException 

/**

获取用于 GPU 和/或硬件访问的输入图像的 HardwareBuffer 句柄。
调用 Image.close() 后,不得使用返回的 HardwareBuffer。
Return:
与此 Image 关联的 HardwareBuffer 或 null(如果此 Image 不支持此功能)。 (不支持的用例包括通过 MediaCodec 获取的 Image 实例,以及 Android P 之前的版本上的 ImageWriter)。

*/

@Nullable
public HardwareBuffer getHardwareBuffer()

/**

设置与该帧关联的时间戳。
时间戳以纳秒为单位,通常单调递增。 来自不同来源的图像的时间戳可能具有不同的时基,因此可能不具有可比性。 时间戳的具体含义和时基取决于提供图像的来源。 有关更多详细信息,请参阅 Camera、CameraDevice、MediaPlayer 和 MediaCodec。
对于通过 ImageWriter.dequeueInputImage() 从 ImageWriter 出列的图像,应用程序需要在将它们发送回 ImageWriter 之前正确设置时间戳,否则时间戳将在调用queueInputImage() 时自动生成。
Param:
时间戳 – 要为此图像设置的时间戳。

*/

public void setTimestamp(long timestamp)

/**

获取与该帧关联的数据空间。

*/

public @NamedDataSpace int getDataSpace() 

/**

设置与该帧关联的数据空间。
如果未设置图像的数据空间,则数据空间值取决于 ImageWriter 构造函数中提供的 android.view.Surface。
Param:
dataSpace – 要为此图像设置的数据空间

*/

public void setDataSpace(@NamedDataSpace int dataSpace) 

/**

获取与该帧关联的裁剪矩形。
裁剪矩形使用最大分辨率平面中的坐标指定图像中有效像素的区域。

*/

public Rect getCropRect()

/**

设置与该帧关联的裁剪矩形。
裁剪矩形使用最大分辨率平面中的坐标指定图像中有效像素的区域。

*/

public void setCropRect(Rect cropRect)

/**

获取此图像的像素平面数组。 平面的数量由图像的格式决定。 如果图像格式为 PRIVATE,应用程序将得到一个空数组,因为图像像素数据无法直接访问。 应用程序可以通过调用getFormat()来检查图像格式。

*/

public abstract Plane[] getPlanes();

/**

释放此帧以供重复使用。
调用此方法后,在此 Image 上调用任何方法都将导致 IllegalStateException,并且尝试读取或写入早期 Image.Plane.getBuffer 调用返回的 ByteBuffer 将出现未定义的行为。 如果图像是通过 ImageWriter.dequeueInputImage() 从 ImageWriter 获取的,则调用此方法后,应用程序填充的任何图像数据都将丢失,并且图像将返回给 ImageWriter 以供重用。 提供给queueInputImage()的图像会自动关闭。

*/

public abstract void close();

/**

获取图像的所有者。
图像的所有者可以是 ImageReader、ImageWriter、MediaCodec 等。此方法返回生成该图像的所有者,如果图像是独立图像或所有者未知,则返回 null。
这是一个包私有方法,仅在内部使用。
Return:
图像的所有者。

*/

Object getOwner() 

/**

获取与该图像关联的本机上下文(缓冲区指针)。
这是一个包私有方法,仅在内部使用。 它可用于获取本机缓冲区指针并传递给本机,该指针可传递给 ImageWriter.attachAndQueueInputImage 以避免反向 JNI 调用。
Return:
与此图像关联的本机上下文。

*/

long getNativeContext()

三、内部抽象类Plane

图像数据的单色平面。
图像中平面的数量和含义由图像的格式决定。
一旦 Image 被关闭,对平面 ByteBuffer 的任何访问都将失败。

/**

此颜色平面的行跨距(以字节为单位)。
这是图像中连续两行像素的起点之间的距离。 请注意,对于某些格式(例如 RAW_PRIVATE),行步幅未定义,并且对这些格式的图像调用 getRowStride 将导致抛出 UnsupportedOperationException。 对于行跨距定义明确的格式,行跨距始终大于 0。

*/

public abstract int getRowStride();

/**

相邻像素样本之间的距离(以字节为单位)。
这是一行像素中两个连续像素值之间的距离。 它可能大于单个像素的大小,以考虑交错图像数据或填充格式。 请注意,对于某些格式(例如 RAW_PRIVATE),像素步幅未定义,并且对这些格式的图像调用 getPixelStride 将导致抛出 UnsupportedOperationException。 对于像素跨度定义明确的格式,像素跨度始终大于 0。

*/

public abstract int getPixelStride();

/**

获取包含帧数据的直接 ByteBuffer。
特别是,返回的缓冲区将始终让 isDirect 返回 true,因此可以将底层数据映射为 JNI 中的指针,而无需使用 GetDirectBufferAddress 进行任何复制。
对于原始格式,每个平面仅保证包含直到最后一行最后一个像素的数据。 换句话说,最后一行之后的步长可能不会映射到缓冲区中。 这是任何交错格式的必要要求。
Return:
包含该平面的图像数据的字节缓冲区。

*/

public abstract ByteBuffer getBuffer();
Android Camera2-预览、拍照、录像流程 重复模式(Repeating):指的是不断重复执行指定的 Capture 操作,当有其他模式的 Capture 提交时会暂停该模式,转而执行其他被模式的 Capture,当其他模式的 Capture 执行完毕后又会自动恢复继续执行该模式的 Capture,例如显示预览画面就是不断 Capture 获取每一帧画面。在 Camera2 上,你可以在规定的曝光时长范围内配置拍照的曝光时间,从而实现拍摄长曝光图片,你甚至可以延长每一帧预览画面的曝光时间让整个预览画面在暗环境下也能保证一定的亮度。 阅读详情

相关推荐

使用Camera2实现预览功能

Camera2原生相机开发,预览功能

weixin_44752167的博客 9385

Android开发 Camera2(最全代码Camera2开发)

因为Camera2提供的功能更加强大,所以使用比Camera1会复杂许多.需要调用的API和回调也更多.这里简单介绍一下这些API的对应功能.好初步认识Camera2.

weixin_42504805的博客 7353

Android 14.0 Camera2 拍照功能默认选前摄像头

在14.0的系统rom产品定制化开发中,对于app调用系统api来打开摄像头拍照的功能也是常有的功能,而拍照一般是默认打开后置摄像头拍照的,由于 客户的产品特殊要求,需要打开前置摄像头拍照功能,所以需要了解拍照功能的流程,然后修改默认前置摄像头打开拍照功能就可以了

安卓兼职framework和app工程师的博客 697

Android Camera2

1.Camera2 Android API 21新增了Camera2,与之前的Camera架构完全不同,使用起来也比较复杂,但是功能变得很强大。 Camera2中几个比较重要的类: ①CameraManager: 管理手机上的所有摄像头设备。它其实是一个系统服务,通过getSystemService(Context.CAMERA_SERVICE)获取,它的作用主要是获取摄像头列表和打开指定的摄像头。 通过CameraManager对象可以得到一些相机的基本信息,这个信息就存储在CameraChara

zenmela2011的专栏 4582

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程,解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响,每N分频,TIE RJ(1𝜎)不变(之前已推导),而Period RJ(1𝜎)增加√N倍。

u010486560的博客 2039

android image 转yuv_android camera2 image 中获得的yuv数据的格式转换

/*** 图片格式转换*/private final int colorFormatI420 = 1;private final int colorFormatNV21 = 2;private byte[] data = new byte[0];private byte[] rowData = new byte[0];private byte[] getDataFromImage(Image im...

weixin_28844235的博客 614

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2489

android image 转yuv_Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存...

importandroid.graphics.ImageFormat;importandroid.media.Image;importandroid.os.Build;importandroid.support.annotation.RequiresApi;importandroid.util.Log;importjava.nio.ByteBuffer;public classImageUtil ...

weixin_29415429的博客 359

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1333

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5579

android camera2 image 中获得的yuv数据的格式转换

/** * 图片格式转换 */ private final int colorFormatI420 = 1; private final int colorFormatNV21 = 2; private byte[] data = new byte[0]; private byte[] rowData = new byte[0]; private byte[] getDataFromI...

haoxuezhe1988的专栏 2766

基于Docker的D435i相机与IMU联合标定实战指南

本文详细介绍了基于Docker的D435i相机与IMU联合标定实战指南,涵盖kalibr镜像构建、IMU标定全流程、双目相机标定技巧及联合标定结果验证。通过Docker容器化部署,简化了复杂依赖环境,提升标定效率与精度,适用于机器人视觉与SLAM应用。

weixin_30872337的博客 239

Android Camera2 设置OIS (optical image stabilization)

Android Camera2 中已经支持设置OIS(optical image stabilization光学防抖)功能,示例代码如下, ... captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); //Either of these two mode you can use one. captureRequestBuilder.set(CaptureRequest.CON.

jgw2008的专栏 1904

基于STM32避障/循迹/蓝牙遥控小车的硬件与软件底层设计

1、实现2m的自动直线行驶,要求左右偏移不大于10cm。2、车载显示屏显示车辆当前行驶速度或车辆运行时间,当前方20cm内出现障碍物时显示与前方障碍物的距离,车每次转弯蜂鸣器报警,同时通过左右指示灯指示转弯方向。3、依次驶过障碍物①②③④,且不触碰障碍物。4、成功进行调头转弯,行驶过程中车轮不碾压黑实线。5、在车道指定位置停车且不越界。6、通过红外、蓝牙、WiFi等任意一种方式实现对小车的控制,使其前进、后退、左转、右转。

2301_78758161的博客 1万+

Android 12 大屏时底下显示任务栏以及虚拟按键靠右问题

Android 12 点大屏时,底下导航栏变成显示任务栏,虚拟按键靠右的分析以及修改

Android系统开发笔记 4686

Android Camera2(2)-Image中获得YUV数据以及YUV格式理解

Image类允许应用通过一个或多个ByteBuffers直接访问Image的像素数据, ByteBuffer包含在Image.Plane类中,同时包含了这些像素数据的配置信息。因为是作为提供raw数据使用的,Image不像Bitmap类可以直接填充到UI上使用。因为Image的生产消费是跟硬件直接挂钩的,所以为了效率起见,Image如果不被使用了应该尽快的被销毁掉。如果Image的数量到达了maxImages,不关闭之前老的Image,新的Image就不会继续生产。

Jwfaikeyan的博客 3235

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2 YUV420_888--android image plane的解释

getPixelStride()获取行内连续两个颜色值之间的距离(步长)。getRowStride()获取行间像素之间的距离。 Camera2 YUV420_888 原创lbknxy 发布于2017-01-23 16:06:35 阅读数 7955 收藏 展开 Camera2 YUV420_888转RGB 官网文档介绍 Android PAI 对 YUV420_888的介绍 ,大致意...

u010029439的博客 2865

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android flash_image,Android L - Take flash image with autofocus using Camera2 api

问题Following camera2basic guide on Android L preview page, I am able to capture normal images, i.e. without flash or using auto-focus mechanism (I rely on passive focus)However, I would like to take a ...

weixin_32657693的博客 120

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android Camera image plane[0] plane[1] plane[2] 详解

都知道拍完照之后都会回调 private ImageReader.OnImageAvailableListener imageAvailableListener= new ImageReader.OnImageAvailableListener() { // 当照片数据可用时激发该方法 @Override public void onImageAvailable(ImageReader reader) { 在拿到ImageReader时我们的操作

hipeboy的博客 3919

Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存

ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Build; import android.support.annotation.RequiresApi; import android.util.Log; import java.n...

weixin_33828101的博客 4756

android camera预览数据,Android Camera系列2 - ImageReader获得预览数据

Android Camera入门上篇文章Android Camera系列1 - Camera2在textureView预览理了理如何实现最简单的TextureView预览Camera2。饭要一口一口的吃,胖子要一斤一斤的长。开门见山,我们需要用到ImageReader这个类去得到一个Image。Image:Image类允许应用通过一个或多个ByteBuffers直接访问Image的像素数据, By...

weixin_30404219的博客 1292

android image 转yuv_转换android.media.Image(YUV_420_888)为位图

I'm trying to implement camera preview image data processing using camera2 api as proposed here: Camera preview image data processing with Android L and Camera2 API.I successfully receive callbacks us...

weixin_30905655的博客 751

android接收get数据格式,Android Camera系列3 - Image中获得YUV数据及YUV格式理解

Android Camera入门接上篇,Android Camera系列2 - ImageReader获得预览数据本篇说一下YUV的格式以及如何从Image中得到真正的YUV数据。YUV的格式网上有很多了,这里就不从YUV的具体格式展开了。这里只分享Camera2设置YUV_420_888时返回的数据格式。如果了解YUV格式,我们知道其实YUV_420_888可以包含很多格式,比如YUV420P(...

weixin_29372549的博客 862
上一篇: Android Camera2-预览、拍照、录像流程
下一篇: Android Camera2 CameraCharacteristics API 详解
闲暇部落
博客等级 码龄12年 2775粉丝 215原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值