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(宽(乘1801(高(。但是,OnImageAvailable拾取的Image对象是1440 x 1440。

很明显,我遗漏了一些东西,但我很难弄清楚它可能是什么

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

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

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

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

最新更新