当前位置: 首页 > 知识库问答 >
问题:

Android Camera2捕捉图像偏斜

邹英悟
2023-03-14

更新:这看起来和这个有关:来自Android camera2 API的图像数据在Galaxy S5上翻转和压扁--我认为这是一个bug,因为Nexus 5/6工作正常,它没有任何意义,需要获得完整的传感器大小,然后手动裁剪达到所需的纵横比,不如不使用“支持的”输出大小以及!

问题:

>

  • 使用Camera2 API获取相机的特性,并提取适合MediaCodeC.Class的输出大小
  • 使用合适的相机输出大小之一创建MediaCodec输入面。将输出提供给某个MediaMuxer或其他什么,以查看输出。
  • 使用编解码器创建的曲面作为目标启动相机捕获请求。
  • 编解码器输出的大小正确。但结果因设备而异:

    • Nexus 5/6:Android 5/6上一切正常。
    • 搭载Android5.1的三星平板:对于某些分辨率,图像明显拉伸,说明摄像头输出分辨率与表面大小不匹配。当相机开始旋转时变得非常明显--图像变得越来越歪斜,因为它没有与x/y轴对齐。对于其他一些分辨率,输出是OK的。这里没有与大小或纵横比相关的模式。

    因此,我创建了一个OpenGL上下文,生成了一个纹理,为它生成了一个SurfaceTexture,将它的默认缓冲区大小设置为相机输出大小,并使用纹理创建了一个表面。我将不去讨论将其绘制到TextureView或返回到mediaCodec的EGL表面的血腥细节。结果是一样的--Camera2捕获请求只在某些分辨率下输出一个失真的图像。深入挖掘:在updateTexImage之后立即调用SurfaceTexture上的getTransformMatrix-矩阵始终是恒等式矩阵,正如预期的那样。

    所以,这里真正的问题是,相机没有在提供的目标表面的大小上捕获。因此,解决方案将是获得实际大小的相机正在捕获,其余的是纯GL矩阵变换,以正确绘制。但是...我该怎么弄呢?

    注意:使用旧的相机API,与目标完全相同的“预览尺寸”和相同的表面(要么是MediaCodec的,要么是自定义的)--一切都很好!但我不能使用旧的camera API,因为它既不推荐使用,也似乎有1080p的最大捕获大小,而Camera2 API超过了这个值,而且我需要支持4K录制。

  • 共有1个答案

    邵星光
    2023-03-14

    所以是的,这是三星设备上的一个bug。

    通常情况下,当您在输出时要求多个不同的纵横比,并且设备特定的相机代码在正确裁剪和缩放它们时会跳过自己时,就会发生这种情况。您可以通过确保所有请求的大小具有相同的纵横比来避免这种情况。

    分辨率实际上可能是您所要求的--但是它被不正确地缩放了(您可以用ImageReader测试这个问题的大小,在那里您可以戳到一个显式的缓冲区。)

    我们正在为Android的兼容性测试添加额外的测试,以确保这种过度的输出不会继续发生。

     类似资料:
    • Camera元素一个关键特性就是可以用来拍照。我们将在一个简单的定格动画程序中使用到它。在这章中,你将学习如何显示一个视图查找器,截图和追踪拍摄的图片。 用户界面如下所示。它由三部分组成,背景是一个视图查找器,右边有一列按钮,底部有一连串拍摄的图片。我们想要拍摄一系列的图片,然后点击Play Sequence按钮。这将回放图片,并创建一个简单的定格电影。 相机的视图查找器部分是在VideoOutp

    • 当我捕获照片时,在某些设备中,它会以景观模式存储在某些设备中,它会存储肖像。我想让图像在肖像模式无论如何。为此,我尝试获取图像的数据,并相应地将其旋转到肖像模式。但在一些设备,如三星,VIVO的方向值得到“0”。我不知道该怎么处理那个值。如果我90,那么一些设备将解决此问题,而另一些设备将向上保存照片。 我从Xamarin那里得到这个主意。Andoid图像旋转。但不知怎的,我不能再继续下去了。会有

    • 我试图做一个简单的应用程序,使用系统相机应用程序来拍照。我已经在android版本6中测试了我的应用程序,我的应用程序成功打开了设备的摄像头。但在一些android v6设备(如三星Galaxy A3)中,我遇到了以下安全异常: 我已经在我的代码中添加了权限检查: 稍后我称之为捕获图像: 从日志中,我看到captureImage第203行调用了startActivityForResult。既然我已

    • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

    • 问题内容: 在Java中是否有捕捉到内存不足错误()的问题? 问题答案: 是的 。以下是一些可能有意义的示例: 如果您想通过 优雅地关闭 程序来处理它 如果要向用户显示问题或 记录错误 根据您的设计,您甚至可以清理内存并 恢复工作状态 但是 ,请注意,通常情况下(除非您处在一次要分配大量内存的位置),对于这些情况,您可能不会专门捕获OutOfMemoryError,而是始终在顶部进行操作主要入口点

    • 我使用MediaStore捕捉图像。ACTION_IMAGE_CAPTURE意图。它在大多数设备中工作正常。但它在一些最新的Android设备中工作不正常。 我的意图是使用相机捕捉图像并将其发送到服务器,但不是将该图像存储在设备的默认库中。 **:当我捕获图像时,它会以onActivityResult方法返回其他一些画廊图像,而不是在一些最新的android设备中捕获的图像。我使用下面的代码来捕获