使用 ImageReader 读取 RGB 图像

2024-04-13

我正在尝试使用ImageReader从相机获取 RGB 图像。我在运行开发者预览版的 Nexus 5 上使用 Android 5.0“L”中的 Camera2 API。请注意,我是not询问如何将 YUV 转换为 RGB - 我正在尝试直接从ImageReader。对于任何想知道如何将 YUV 转换为 RGB 的人,请随时咨询另一个问题,例如将Androidcamera2 api YUV_420_888转换为RGB https://stackoverflow.com/questions/30510928/convert-android-camera2-api-yuv-420-888-to-rgb.

我已经有一个SurfaceView配置为 RGB 图像,工作正常,并且我相信相机硬件会生成 RGB 数据(因为 Android 上的所有色调映射和颜色增益设置都指定为在 RGB 通道上操作)。

我可以通过以下方式创建 ImageReader 从 ImageReader 获取 YUV_420_888 图像:

imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4);

然后将YUV图像转换为RGB图像。然而,这会引入不必要的量化误差(因为我的应用程序需要 RGB 图像)和不必要的处理时间。

但是,当我尝试以这种方式创建图像读取器时:

imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4);

图像捕获失败,但出现以下异常:

java.lang.UnsupportedOperationException: The producer output buffer format 0x22 doesn't match the ImageReader's configured buffer format 0x3.
        at android.media.ImageReader.nativeImageSetup(Native Method)
        at android.media.ImageReader.acquireNextSurfaceImage(ImageReader.java:293)
        at android.media.ImageReader.acquireNextImage(ImageReader.java:339)
        at android.media.ImageReader.acquireLatestImage(ImageReader.java:243)
        at <my code...>

我在两个方面感到困惑。首先,提到的输出格式 0x22 既不是 PixelFormat 也不是 ImageFormat。这似乎是某种未记录的原始模式,但我无法使用ImageReader.newInstance(W, H, 0x22, 4)捕捉它(我得到java.lang.UnsupportedOperationException: Invalid format specified 34)。我很想以原始格式捕获,但我无法说服 ImageFormat 接受它(以及其他原始格式ImageFormat.RAW_SENSOR由于某种原因速度非常慢)。

其次,SurfaceView已经在愉快地消费了RGB_888图像(据我所知),并将它们直接放在屏幕上。那么为什么不是ImageReader无法正确接受 RGB 图像?我做错了什么?


错误异常的原因是PixelFormat.RGB_888 https://developer.android.com/reference/android/graphics/PixelFormat那不一样ImageFormat.RGB_888 https://developer.android.com/reference/android/graphics/ImageFormat.

PixelFormat.RGB_888 https://developer.android.com/reference/android/graphics/PixelFormat相当于ImageFormat.RGB_565 https://developer.android.com/reference/android/graphics/ImageFormat不是你用过的那个ImageFormat.RGB_888 https://developer.android.com/reference/android/graphics/ImageFormat.

你必须使用ImageFormat.RGB_888 https://developer.android.com/reference/android/graphics/ImageFormat代替PixelFormat.RGB_888 https://developer.android.com/reference/android/graphics/PixelFormat像这样:

imageReader = ImageReader.newInstance(W, H, ImageFormat.RGB_565, 4);

这允许捕获RGB从相机使用ImageReader https://developer.android.com/reference/android/media/ImageReader.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ImageReader 读取 RGB 图像 的相关文章

  • BLE 外设支持 Android-L 示例 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我希望有一个适用于 Android L 的 BLE 外设模式的示例 我的代码给了我奇怪的错误 即广告商太多 这没有任何意
  • 意图?如何注册以获得传入电子邮件提醒?

    这里是极限 Android 开发新手 好吧 Android 开发新手 而不是一般开发 我想编写一个应用程序 当电子邮件进入设备时会收到通知 并根据电子邮件中的数据 主题 发件人 收件人等 采取各种操作 我认为我要做的是创建一个带有 Inte
  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • startActivity overridePendingTransition 只显示进入动画

    基本上 我遇到的问题是只显示输入幻灯片动画 调用 Activity 不会产生动画 startActivity intent overridePendingTransition R anim right in partly R anim le
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • Android ListView 自定义适配器 ImageButton

    这可能不是正确的方法 如果有更好的方法请告诉我 我创建了一个自定义适配器类 在我的 getView 方法中我膨胀了我想要使用的视图 public View getView int position View convertView View
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android BLE 扫描在后台几分钟后停止

    当我为公司开发新冠肺炎接触者追踪应用程序时 我在后台遇到了 Android 扫描停止问题 这是我尝试过的 添加前台服务 禁用手机中所有与电池相关的优化选项 启用后台运行的应用程序 测试设备 搭载 Android 10 的 Galaxy S2
  • 如何更改对话框片段内的片段

    我想做一个空的DialogFragment with a LinearLayout然后更改里面的片段LinearLayout 例如 第一个片段是 3 个按钮 facebook google 电子邮件登录 的登录 当有人按下电子邮件时 第 2
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • android 多关键词搜索

    我的应用程序包含搜索功能 它将搜索数据库内的内容 我的搜索的弱点是 我只能使用一个标签进行搜索 例如我只能搜索 猫 它会返回我的数据库中包含 猫 一词的内容 因为我正在使用LIKE在 select 语句期间进行查询 如何使用多个标签进行搜索
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • Android 4.2 - Environment.getExternalStorageDirectory().getPath() 行为

    我一直在开发一个android应用程序 在上次更新到4 2之前 我使用 Environment getExternalStorageDirectory getPath 它返回了我 storage sdcard0 但自从更新后我现在得到了 s
  • 改造方法调用可能会产生“java.lang.NullPointerException”

    使用 Retrofit 2 3 0 我在 Android Studio 中收到以下消息 有关如何删除此 IDE 错误消息的任何建议 谢谢 来自Response文档 http square github io retrofit 2 x ret

随机推荐