камера андроида растянута в ландшафтном режиме - PullRequest
22 голосов
/ 28 сентября 2011

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

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.

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

enter image description here

enter image description here

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

Ответы [ 2 ]

21 голосов
/ 03 марта 2012

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

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

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

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

Используйте

мерзавец клон https://android.googlesource.com/platform/packages/apps/Camera.git

для получения источников камеры.

7 голосов
/ 06 октября 2012
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(); 

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

...