Камера в 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.