2016-08-24 3 views
1

Я начинаю использовать Camera2 Api вместо устаревшей камеры Api, но у меня есть проблема. я создала ImageReader сImageReader on Camera2 Api android

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 

Почему размеры меняются?

ответ

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; 
} 

Я пытаюсь получить наименьший размер изображения, которое равно или больше размер экрана, поскольку использование обеспечивает максимальную скорость, обеспечивая изображение, которое заполняет экран устройства.

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, например).

Также вы не можете настроить несколько ImageReaders в определенных размерах, это должно быть проблемой, если вы работаете в приложении Camera с таким количеством режимов. Вы можете узнать об этом по следующей ссылке: https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

Надеюсь, что это вам поможет!

Смежные вопросы