4

Я разрабатываю пользовательское приложение для камеры с помощью Android Camera2 API, где вы можете переключаться между различными разрешениями камеры и видео, доступными в телефоне. Он также предлагает возможность снимать квадратные снимки 1: 1. Чтобы взять квадратные снимки, я беру обычное изображение 4: 3, а затем обрезаю его, чтобы сохранить 1: 1. (Таким образом, 4032x3024 будет 3024x3024).Различные размеры вывода на определенные разрешения камеры в Android

Я заметил проблему при съемке изображения 1: 1 на определенных разрешениях, выход слегка обрезается (увеличивается). Это результат того же снимка с двумя различными разрешениями:

The first picture was taken at 1944x1944

The second picture was taken at 3024x3024

My Nexus 5X поддерживает 12MP, 8MP, 5MP и 2Mp 4: 3. Эта проблема возникает, когда я использую разрешение более 5 МП.

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

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer(); 
byte[] bytes = new byte[buffer.remaining()]; 
buffer.get(bytes); 
cropSquareImageByteArray(bytes); 

Метод cropSquareImageByteArray:

public static byte[] cropSquareImageByteArray(byte[] bytes) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    int w = bitmap.getWidth(); 
    int h = bitmap.getHeight(); 
    Bitmap dst = Bitmap.createBitmap(bitmap, 0, h - w, w, w); 
    dst.compress(Bitmap.CompressFormat.JPEG, 98, bos); 
    return bos.toByteArray(); 
} 

Я предполагаю, что причина для обрезки является 4: 3 изображение в 16: 9. Потому что я заметил, что при вызове

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

Размеры для сгенерированного выходного битового массива являются 1280x960 (4: 3) в 2МПЕ, 1600x1200 (4: 3) в 5MP, но для больших разрешений 1920x1080 (16: 9), поэтому изображение 4: 3 настраивается на растровое изображение 16: 9, возможно, вызывает урожай.

Я пытаюсь выяснить, как это решить. Я также проверил этот пост Android 5.0 Wrong crop regions on preview surface and captured still image, но не нашел там решения.

* Редактирование: Мой ImageReader настроен так:

public void configureImageReader(Size pictureSizeValue, ImageReader.OnImageAvailableListener listener) { 

    if (mImageReader == null) { 
     mImageReader = ImageReader.newInstance(pictureSizeValue.getWidth(), pictureSizeValue.getHeight(), 
       ImageFormat.JPEG, 2); 
    } 
    mImageReader.setOnImageAvailableListener(listener, mBackgroundHandler); 

} 

Значение pictureSizeValue является выходным я хочу. Таким образом, для квадрата изображения это похоже на 3024x3024.

+0

Ваше второе изображение, которое должно быть 3024x3024, выглядит только 1080x1080. Так что да, кажется, вы обрезаете изображение 1920x1080 на квадрат. Итак, ImageReader дает вам другой размер, чем вы хотели. Как вы настраиваете ImageReader? Похоже, этот код выбирает неправильный размер для более высоких разрешений. –

+0

Я добавил код для ImageReader. Входной сигнал размера для ImageReader - это точный результат, который я хочу, например 3024x3024, который работает для меньших разрешений. –

+0

А, это будет проблема. См. Мой ответ. –

ответ

3

До определенного момента устройство камеры будет округлять запрошенный размер до поддерживаемого, чтобы сделать предварительный просмотр камеры более гибким для настройки, но только до 1080p (чтобы в целом обеспечить приемлемую частоту кадров для предварительного просмотра).

Прошлое, вам нужно фактически выбрать поддерживаемое разрешение из списка, предоставленного устройством, или вы просто округлите до 1080p.

Поддерживаемые форматы и форматы вывода могут быть запрошены с помощью StreamConfigurationMap .getOutputSizes(). Вам нужно будет отсканировать список для размера, который соответствует вашим требованиям, и имеет соотношение сторон, которое соответствует формату изображения датчика изображения (доступно через activeArraySize)

Я бы дважды проверил все размеры ниже 1080p как ну, чтобы убедиться, что вы на самом деле получаете то, что хотите. Округление всегда имеет меньшее разрешение, чтобы минимизировать производительность и требования к памяти.

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