камера Android растянута в ландшафтном режиме

Приложение, которое я пишу, требует функции камеры. Чтобы узнать, как работать с камерой, я выполнил следующий сценарий:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html.

Я поместил действие в свой манифест, установил для него ориентацию экрана в ландшафтном режиме.

Проблема, с которой я столкнулся, заключается в том, что когда камера держится боком (поэтому я держу свой Galaxy Tab P1000 в альбомном положении), вид растягивается.

Чтобы быть более конкретным в отношении моего сценария, я использовал точную копию кода, созданного Google. Его можно найти в папке android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

Сам файл называется CameraPreview.

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

введите описание изображения здесь

введите описание изображения здесь

Что я сделал: я держал вкладку «Галактика», чтобы сфотографировать объект (в данном случае ноутбук), а затем сфотографировал на телефон свою Галактику. На Galaxy у меня открыт экран камеры в приложении, которое я создаю. Это учитывается для обоих изображений. Один держу боком, а другой держу в портретной ориентации. Фотографии немного нечеткие, но вы можете видеть, что на пейзажном снимке камера стала очень широкой.


person Joey Roosing    schedule 28.09.2011    source источник
comment
T_T Так я единственный в мире, у кого такая проблема? ‹:   -  person Joey Roosing    schedule 28.09.2011
comment
Я тоже испытываю эту проблему ...   -  person Saty    schedule 14.04.2016
comment
Этот вопрос - скрытая жемчужина! Мне было трудно это искать. Использовав все ключевые слова в google. Этот вопрос спас мне жизнь.   -  person Neon Warge    schedule 13.07.2016


Ответы (2)


Вчера я столкнулся с той же проблемой. Изучив источники "Камеры", я нашел причину, по которой превью камеры растягивается.

Причина: соотношение сторон SurfaceView (ширина / высота) ДОЛЖНО быть таким же, как соотношение сторон Camera.Size, используемое в параметрах предварительного просмотра. И если соотношение сторон не такое, у вас растянутое изображение.

Итак, самый быстрый обходной путь - установить SurfaceView размером 320 x 240 пикселей - наименьший поддерживаемый размер из Parameters.getSupportedPreviewSizes ().

Кроме того, вы можете посмотреть стандартные источники приложения Camera, оно использует настраиваемый макет для управления размером SurfaceView (см. PreviewFrameLayout.java, функция onMeasure ()).

Использовать

git clone https://android.googlesource.com/platform/packages/apps/Camera.git

чтобы получить источники камеры.

person Lord    schedule 03.03.2012
comment
+1 за описание актуальной проблемы. Вы можете найти высоту и ширину SurfaceView в surfaceChanged, затем использовать getSupportedPreviewSizes в объекте параметров камеры, чтобы найти наиболее близкое соответствие и установить SurfaceView на необходимый приемлемый размер. - person Christopher Perry; 07.12.2012
comment
делаю так, но не работает. частный Camera.Size getBestPreviewSize (ширина int, высота int, параметры Camera.Parameters) {Camera.Size result = null; for (Camera.Size size: parameters.getSupportedPreviewSizes ()) {if (size.width ‹= width && size.height‹ = height) {if (result == null) {result = size; } еще {int resultArea = result.width * result.height; int newArea = size.width * size.height; если (newArea ›resultArea) {результат = размер; }}}} return (результат); } - person gIrL; 09.10.2014
comment
Ваш код просто ищет самый большой размер предварительного просмотра, который соответствует исходной ширине и высоте. Конечно, у вас проблемы с растянутым экраном, потому что самый большой не означает лучшего соотношения сторон. Вам необходимо подогнать размер предварительного просмотра к этому самому большому размеру, отрегулировав его ширину или высоту так, чтобы соотношение = ширина / высота было одинаковым для начальных значений (ширина, высота) и для конечных значений (результат.ширина, результат. рост) - person Lord; 09.10.2014

public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

        try {
            camera = Camera.open();

            camera.setDisplayOrientation(90);
            camera.setPreviewDisplay(holder);
            Camera.Parameters parameters = camera.getParameters();
            List<Size> sizes = parameters.getSupportedPictureSizes();
            parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0
            parameters.set("orientation","portrait");
            //parameters.setPreviewSize(viewWidth, viewHeight);
            List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters);
            camera.startPreview();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Вам нужно только getSupportedPreviewSizes() и сохранить его в List:

List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters); 



camera.startPreview(); 

Я надеюсь, это поможет вам.

person Quoc Nguyen    schedule 06.10.2012