Подтвердить что ты не робот

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

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

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

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

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

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

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

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

enter image description here

enter image description here

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

4b9b3361

Ответ 1

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

Причина в том, что соотношение сторон 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

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

Ответ 2

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

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