Camera2上的ImageReader Api android

时间:2016-08-24 16:41:25

标签: android image yuv android-camera2

我开始使用Camera2 Api而不是弃用的Camera Api,但我遇到了问题。 我用

设置了一个ImageReader
ImageReader.newInstance(100, 130, ImageFormat.YUV_420_888, 2);

但是当我在onImageAvailable中记录图像尺寸时:

Image img = null;
        img = imageReader.acquireLatestImage();

        if(img != null){

            Log.d("Dimen3", Integer.toString(img.getHeight()) + " " + img.getWidth());}

它说:

08-24 18:25:43.115 28363-28363/com.example.ale.camera2prova D/Dimen3: 144 176

为什么要更改尺寸?

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您就会问为什么不能为ImageReader图像使用任意尺寸。答案就是他们设计ImageReader的方式。 ImageReader可能正在选择最接近您请求大小的预定义大小。要避免这种情况,请从预定义列表中选择一个大小。我写了一个小例程,它获取大小列表并选择最小的一个等于或大于屏幕大小:

private Size selectImageSize() {
    CameraCharacteristics cameraCharacteristics = null;
    try {
        cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
    } catch (CameraAccessException e) {
        return null;
    }

    StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    if (streamConfigurationMap == null) {
        return null;
    }
    jpegSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int screenLength = size.x;
    if (screenLength < size.y) {
        screenLength = size.y;
    }

    int index = 0;
    int finalIndex = 0;
    int finalJpegLength = Integer.MAX_VALUE;
    for (Size jpegSize : jpegSizes) {
        int jpegLength = jpegSize.getWidth();
        if (jpegLength < jpegSize.getHeight()) {
            jpegLength = jpegSize.getHeight();
        }
        if (jpegLength >= screenLength) {
            if (jpegLength < finalJpegLength) {
                finalJpegLength = jpegLength;
                finalIndex = index;
            }
        }
        index++;
    }

    Size returnSize = new Size(jpegSizes[finalIndex].getWidth(), jpegSizes[finalIndex].getHeight());
    return returnSize;
}

我正在尝试获得等于或大于屏幕尺寸的最小图像尺寸,因为使用它可以提供最快的速度,同时提供将填满设备屏幕的图像。

答案 1 :(得分:0)

您只需在imageReader中设置手机支持的可用尺寸即可。你可以用这种方法知道它:

public static Size[] previewSizes;
public static Size[] videoSizes;
public static Size[] pictureSizes;

     StreamConfigurationMap map = cameraCharacteristics.get(                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

        previewSizes = map.getOutputSizes(SurfaceTexture.class);
        videoSizes = map.getOutputSizes(MediaRecorder.class);
        pictureSizes = map.getOutputSizes(ImageFormat.JPEG);

您可以在imageReader中设置pictureSizes调用的结果(同样,根据我们所讨论的ImageReader的格式,某些设备将支持YUV或JPEG格式的某些尺寸,但不支持RAW)。

此外,您无法配置特定尺寸的多个ImageReader,如果您在具有如此多模式的相机应用程序中工作,这应该是一个问题。您可以在下一个链接中阅读更多相关信息: https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

希望它能帮到你!