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

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

Поэтому я установил размер изображения камеры 1280×720, и результат был идеальным. Однако я не могу установить размер в коде, потому что каждое устройство 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-планшете после измерения это результаты для трех используемых переменных

Размер макета viewGroup в действии в результате измерения

  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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 // 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.