我正在使用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(高)。但是,Image
拾取的OnImageAvailable
对象是1440 x 1440。
显然我缺少了一些东西,但是我很难找出可能是什么。
附录:如果我将格式从YUV 420888更改为JPEG,则会返回正确的尺寸。但是实际上,我真正需要的是将图像转换为RGB字节数组,并且YUV似乎是更可取的格式。可以将RGB请求为图像格式类型,但是我正在测试的设备不接受。
答案 0 :(得分:2)
对于YUV预览图像,即使将预览表面设置为纵向,回调也会返回原始的1440x1800横向图像。为了进行静态拍摄,在Jpeg中,某些设备会真正旋转图像。其他仅标记EXIF方向标记。
在您的代码中,您可能需要
let imageReader = ImageReader.NewInstance(surfaceView.Height, surfaceView.Width, ImageFormatType.Yuv420888, 1)