Android Camera2 回调 -- 图像似乎被裁剪了
Android Camera2 callback -- image appears to be cropped
我正在研究 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 预览图像,回调 returns 原始横向 1440x1800 图像,即使您将预览表面设置为纵向。对于静态捕获,在 Jpeg 中,一些设备执行图像的真实旋转;其他的只标记EXIF方向标志。
在您的代码中,您可能需要
let imageReader = ImageReader.NewInstance(surfaceView.Height, surfaceView.Width, ImageFormatType.Yuv420888, 1)
我正在研究 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 预览图像,回调 returns 原始横向 1440x1800 图像,即使您将预览表面设置为纵向。对于静态捕获,在 Jpeg 中,一些设备执行图像的真实旋转;其他的只标记EXIF方向标志。
在您的代码中,您可能需要
let imageReader = ImageReader.NewInstance(surfaceView.Height, surfaceView.Width, ImageFormatType.Yuv420888, 1)