ImageReader приобретает последний образ с другим разрешением, чем сам ImageReader на Galaxy S6

Я пытаюсь прочитать изображение из ImageReader с определенным разрешением (получено из CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP конечно), но ImageReader.acquireLastestImage возвращает изображение другого разрешения!

Примечание: это происходит только (насколько я видел) на Samsung Galaxy S6 с разрешением предварительного просмотра, установленным на 800x450, и выходное разрешение на изображении, по-видимому, составляет 640x480. Другие разрешения кажутся нормальными, как и другие телефоны.

Соответствующий код:

Image im = mReader.acquireLatestImage();
Log.v(TAG, String.format("Image       size %d x %d", im.getWidth(), im.getHeight()));
Log.v(TAG, String.format("ImageReader size %d x %d", mReader.getWidth(), mReader.getHeight()));

Выходной журнал:

01-30 15:43:46.350 31422-31954/com.myapp V/ImageProcessor: Image       size 640 x 480
01-30 15:43:46.350 31422-31954/com.myapp V/ImageProcessor: ImageReader size 800 x 450

Что может быть не так? Ошибка в Android? Ошибка в реализации Galaxy S6?

Разве не гарантируется, что камера будет выполнять запрос поверхности ImageReader?

2 ответа

Проблема может заключаться в том, что вы читаете "неправильные" выходные данные. Попробуйте получить выходные размеры с тем же ImageFormat это используется при инициализации вашего ImageReader.

Так, например, если вы инициализируете свой ImageReader с

ImageReader.newInstance(width, height, ImageFormat.JPEG, 1)

Получите ваши доступные размеры вывода с

cameraCharacteristics
  .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
  .getOutputSizes(ImageFormat.JPEG)

В моем случае я использовал ImageReader.class вместо ImageFormat.JPEG при получении доступных размеров вывода, таким образом, я получил некоторые размеры вывода, которые не были поддержаны форматом JPEG.

У меня нет S6 под рукой, (и если бы я имел, это может не совпадать с вашим). Тем не менее, я могу подтвердить, что 800x450 - очень странное разрешение для камеры телефона. Это может быть ошибкой на некоторых устройствах S6, которая делает ложное утверждение о поддержке этого размера предварительного просмотра.

Если это так, я не удивлюсь: я видел несколько моделей от разных брендов, которые имели похожие ошибки, в том числе Samsung Galaxy Nexus, который ложно сообщил о поддержке 320x240. Это устройство также (как и ваш S6) создавало изображения разного размера, когда наше приложение запрашивало QVGA.

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

В любом случае, предустановленное приложение камеры не использует 800x450:

задний

S6 Front