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

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

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

2 ответа

Решение

Я столкнулся с той же проблемой вчера. После исследования источников "Камера" я нашел причину растягивания предварительного просмотра камеры.

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

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

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

использование

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

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

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(); 

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

Другие вопросы по тегам