创建没有宽度/高度的ImageReader

时间:2016-12-06 17:24:15

标签: android android-camera android-camera2 android-graphics

当我尝试创建深度点云类型的imageReader时,我得到一个空对象。

这样做的原因是我已经为此Camera2Basic修改了代码,它从流配置图中获得了最大的输出大小。问题在于,由于它是一个点云,因此输出的宽度和高度都不合理。因此它返回null宽度和高度,导致null imageReader:

Size largest = Collections.max(
        Arrays.asList(map.getOutputSizes(ImageFormat.DEPTH_POINT_CLOUD)),//Returning null
        new CompareSizesByArea());

mDMImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.DEPTH_POINT_CLOUD, 2);

因此,我真正看到的唯一解决方案是,如果有一种方法可以为深度点云格式创建imageReader,遗憾的是我无法看到这样做的方法,因为它需要有宽度和高度,这显然是不可能的。因此我的问题。

感谢您提供的任何帮助和建议。

1 个答案:

答案 0 :(得分:1)

如果我没有错,你就无法创建一个宽度和高度为null的ImageReader。原因是,您可以在documentation中读取您设置为高度和宽度的值是ImageReader将生成的每个图像的默认大小值。

我建议您使用预览宽度和高度值(您应该存储在某个变量中或在某个地方动态计算),或者设备可以支持的最大值。您可以使用以下方法计算相机设备支持的图像尺寸:

    private static List<Size> getOutputSizes(CameraCharacteristics cameraCharacteristics, Object kind) {
         //my kind value is ImageFormat.JPEG in this example
          StreamConfigurationMap streamConfigurationMap = cameraCharacteristics
             .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
          if (streamConfigurationMap != null) {
             Size[] availableResolutionsArray;
             //The parameter is either an Integer (JPEG) or a class (MediaRecorder.class)
             if (kind instanceof Integer) {
                availableResolutionsArray = streamConfigurationMap.getOutputSizes((Integer) kind);
             } else {
                availableResolutionsArray = streamConfigurationMap.getOutputSizes((Class) kind);
             }
             List<Size> availableResolutions = Arrays.asList(availableResolutionsArray);    

             return availableResolutions;
          } else {
             return Collections.singletonList(new Size(DEFAULT_WIDHT, DEFAULT_HEIGHT));
          }
       }