java - Android Camera2 回调——图像似乎被裁剪

标签 java android f# android-camera2

我正在研究 Camera2 API。这项工作正在进行中,但我对图像尺寸感到困惑。

以下是我设置回调的方式(我正在使用 Xamarin,语言是 F#,但具体语言并不重要):

type CameraCallback(surfaceView: SurfaceView) =
    inherit CameraDevice.StateCallback()
    interface ImageReader.IOnImageAvailableListener with
        member this.OnImageAvailable(imageReader) = 
            let image = imageReader.AcquireNextImage()
            let planes = image.GetPlanes()
            let yBuffer, uBuffer, vBuffer = planes.[0].Buffer, planes.[1].Buffer, planes.[2].Buffer
            image.Close()
    override this.OnOpened(cameraDevice) =
        let imageReader = ImageReader.NewInstance(surfaceView.Width, surfaceView.Height, ImageFormatType.Yuv420888, 1)
        imageReader.SetOnImageAvailableListener(this, null)
        let surfaces = [|surfaceView.Holder.Surface; imageReader.Surface|]
        cameraDevice.CreateCaptureSession(surfaces, new CaptureSessionCallback(surfaces), null)
    override __.OnDisconnected(camera) = 
        camera |> ignore
    override __.OnError(camera, error) = 
        camera |> ignore

当我设置ImageReader时,surfaceView的输入尺寸为1440(宽度)x 1801(高度)。但是,OnImageAvailable 拾取的 Image 对象的尺寸为 1440 x 1440。

显然我遗漏了一些东西,但我无法找出它可能是什么。

ADDENDUM:如果我将格式从 YUV 420 888 更改为 JPEG,则会返回正确的尺寸。但实际上我真正需要的是将图像转换为RGB字节数组,而且YUV似乎是更好的格式。可以请求 RGB 作为图像格式类型,但我正在测试的设备不接受这一点。

最佳答案

对于 YUV 预览图像,即使您将预览表面设置为纵向,回调也会返回原始横向 1440x1800 图像。对于静态捕捉,在 Jpeg 中,某些设备会执行图像的真实旋转;其他的仅标记 EXIF 方向标志。

在您的代码中,您可能需要

let imageReader = ImageReader.NewInstance(surfaceView.Height, surfaceView.Width, ImageFormatType.Yuv420888, 1)

关于java - Android Camera2 回调——图像似乎被裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51347069/

相关文章:

java - 我可以使用版本限定符来要求 OSGi 中的特定包版本吗?

java - Android 应用程序首选项中的值是否会自动保存?

JavaFX 预加载器配置 IntelliJ IDEA(Java 9 及更高版本)

android - 如何在 Android 项目中查找传递依赖项

android - ListView可以出现在Activity中,但不能出现在Fragment中

visual-studio-2010 - Visual Studio 中配置的编辑器语言在哪里?

asynchronous - 结合 F# 异步函数

java - Spring Security配置问题

android - 如何滚动 ListView 直到我看到 Calabash-Android 的特定字符串

azure - Azure 上 Suave 中的 SqlDataProvider 连接字符串