如何解决在 Google 的示例代码中使用 Android camera2 API 错误旋转图像?
我尝试编写自己的代码来通过 Android 上的 camera2 API 访问相机,而不是使用 Google's example。一方面,我浪费了太多时间来理解到底发生了什么,但另一方面,我注意到了一些很奇怪的事情:
我希望相机产生垂直图像。但是,尽管 ImageReader
初始化时高度大于宽度,但我在 onCaptureCompleted
中获得的图像大小相同,只是旋转了 90 度。我在努力理解我的错误,所以我去探索谷歌的代码。我发现他们的图像也旋转了 90 度!他们通过在 JPEG_ORIENTATION
中设置 CaptureRequestBuilder
键来弥补这一点(如果您注释该单行,保存的图像将被旋转)。这与设备方向无关 - 就我而言,应用完全禁用屏幕旋转。
问题是,为了我制作的应用程序的目的,我需要来自相机的非压缩精确数据,因此由于 JPEG a) 压缩图像 b) 有损失,我无法使用它。相反,我使用 YUV_420_888 格式,稍后将其转换为 Bitmap
。但是,虽然 JPEG_ORIENTATION
标志可以固定 JPEG 图像的方向,但它似乎对 YUV 图像没有任何作用。那么如何正确旋转图像呢?
一个明显的解决方案是旋转生成的 Bitmap
,但我不确定我应该在不同的设备上旋转哪个角度。更重要的是,是什么导致了这种奇怪的行为?
更新: 旋转位图并将其缩放到合适的尺寸需要太多时间进行预览(上下文如下:我需要处理来自相机的高分辨率图像和缩小尺寸的图像)预览中这些相同图像的版本。假设我正在制作类似于二维码识别的东西)。我什至尝试使用 RenderScripts 来有效地处理图像,但这仍然太长。另外,我读过here,当我同时设置多个输出表面时,所有输出表面都将使用相同的分辨率,这对我来说非常糟糕。
解决方法
Android 以横向模式存储每张图像,无论是横向还是纵向拍摄。它还存储元数据,告诉您图像应该以纵向还是横向显示。
如果您不根据元数据转动图像,您最终会得到每张横向图像。我也有这个问题(但我想要压缩,所以我的解决方案对你不起作用)。
您需要阅读元数据并相应地进行转换。 我希望这至少会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。