代码之家  ›  专栏  ›  技术社区  ›  Rob Lyndon

Android Camera2回调-图像似乎被剪切

  •  0
  • Rob Lyndon  · 技术社区  · 6 年前

    我正在开发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(高)。但是, Image 被拾起的物体 OnImageAvailable 是1440 x 1440。

    很明显我遗漏了一些东西,但我很难找到可能是什么。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex Cohn    6 年前

    对于yuv preview image,回调将返回原始横向1440x1800图像,即使将预览表面设置为纵向。对于静止捕获,在jpeg中,一些设备执行图像的真正旋转;其他设备只标记exif方向标志。

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

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