Камера в Android, как получить лучший размер, размер предварительного просмотра, размер изображения, размер изображения, искаженное изображение

с искаженным изображением при смешивании представления из OpenGL и камеры Android, чтобы получить изображение как при использовании метода takepicture. Я проверил и обнаружил, что для изображения камеры установлено значение 640X480, а представление openGL и предварительный просмотр камеры установлены на 1280x720.

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

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

лучше ли использовать match_parent или fitXY для размера FrameLayout и работать только с двумя переменными, размером предварительного просмотра и размером изображения?

обратите внимание, что несколько комбинаций ширины и высоты в размерах предварительного просмотра и размерах изображения одинаковы. например, 1280 x 720 существует как в предварительном просмотре, так и в изображении, всегда ли так, что будут совпадения в обоих размерах?

 List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();

 List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();

 // layout in the activity that the cameraView will placed in
 int layoutWidth = frameLayout.getWidth();
 int layoutHeight = frameLayout.getHeight();

например, на одном Android-планшете после измерения, это результаты для трех используемых переменных

размер представления макетаГруппа в активности в результате измерения

 1280 x 736

поддерживаемые размеры изображений

 320 x 240
 640 x 480
 1024 x 768
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 920
 1600 x 1200
 2048 x 1536
 2560 x 1440
 2560 x 1536
 2560 x 1920  << native resolution of hardware camera

поддерживаемые размеры предварительного просмотра

 176 x 144
 320 x 240
 352 x 288
 480 x 320
 480 x 368
 640 x 480
 800 x 480
 800 x 600
 864 x 480
 864 x 576
 960 x 540
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 960

Ответы

Ответ 1

Чаще всего, но не всегда, существует соответствие между пропорциями изображения и пропорциями предварительного просмотра. Вы можете быть уверены, что по крайней мере некоторые из них являются классическими соотношениями 4: 3 (например, 640x480). Поддержка 16: 9 также широко доступна.

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

Обратите внимание, что размер экрана (как указано в технических спецификациях для разных устройств) не всегда доступен для вашего изображения. Например, системные меню, строка заголовка и т.д. Могут принимать участие в экранной недвижимости. Режим immersive доступен на некоторых устройствах, и его поведение зависит от версии системы. Вы можете ожидать, что будущие разработки Android, например. вторая поддержка экрана, сделает игру еще более интересной.

Итак, ответы на ваши конкретные вопросы:

лучше использовать match_parent или fitXY для размера FrameLayout и работать только с двумя переменными, размером предварительного просмотра и размером изображения? - нет.

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

Даже если ваша камера поддерживает разные "широкие" размеры изображений, 1280x720 предварительный просмотр и 2560x1440 изображение могут быть наилучшим образом совпадают, как в 16:9. Обычно качество изображения при малом размере не намного лучше, чем предварительный просмотр того же размера, поэтому вы можете сохранить кадр предварительного просмотра, если 1280x720 - это то, что вам действительно нужно.

Если вы можете отказаться от takePicture(), ваше приложение будет гораздо более отзывчивым.

Ответ 2

Возможный алгоритм:

1) получить соотношение сторон выходной области (= ширина/высота)

2) итерации с поддерживаемыми размерами:

Выберите самый большой из них с близким соотношением сторон (+ 5%, например) Если ничего близкое или слишком низкое разрешение - просто сделайте поверхную поверхность (которую вы рисуете кадры), будет иметь тот же формат изображения, что и самый большой поддерживаемый размер, и центрируйте его в родительском представлении

Насколько велик размер предварительного просмотра и размеры изображения. Если вы хотите, чтобы они имели одинаковое соотношение сторон, то лучшим выбором является использование выбранного соотношения размеров изображения в 1) Таким образом, вам, вероятно, придется центрировать свою поверхность в виде родителя

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

Ответ 3

Я думаю, что лучший способ получить preview size, picture size - камера была настроена для поддержки всех Android-устройств. Это означает, что preview size, picture size, который вы решили настроить, соответствует популярному формату, поддерживаемому всеми устройствами, например. составляет 1280x720 и т.д.

Как и в следующих кодах, есть ex. что я использовал.

// start preview with new settings
    try {
        // set preview size and make any resize, rotate or
        // reformatting changes here
        Camera.Parameters parameters = mCamera.getParameters();

        for (Camera.Size size : parameters.getSupportedPictureSizes()) {
            // 640 480
            // 960 720
            // 1024 768
            // 1280 720
            // 1600 1200
            // 2560 1920
            // 3264 2448
            // 2048 1536
            // 3264 1836
            // 2048 1152
            // 3264 2176
            if (1600 <= size.width & size.width <= 1920) {
                parameters.setPreviewSize(size.width, size.height);
                parameters.setPictureSize(size.width, size.height);
                break;
            }
        }
        // Set parameters for camera
        CustomCamera.mCamera.setParameters(parameters);

        Camera.Size size = CustomCamera.mCamera.getParameters().getPictureSize();

        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

Best size зависят от камеры MP. Поэтому я думаю, что следует использовать default, если вы используете Camera.