Соотношение сторон предварительного просмотра камеры Nexus 4 всегда требует просмотра поверхности 16x9? Почему

Устройство Nexus 4 Android версии: 4.2.2

Надеюсь, что кто-то еще нашел это и может объяснить, как это решить....

Nexus 4 поддерживает следующие размеры предварительного просмотра: –

W:1280 H:720 Ratio: 1.777777
W:800 H:480 Ratio: 1.6666666
W:768 H:432 Ratio: 1.7777778
W:720 H:480 Ratio: 1.5
W:640 H:480 Ratio: 1.3333334
W:576 H:432 Ratio: 1.3333334
W:480 H:320 Ratio: 1.5
W:384 H:288 Ratio: 1.3333334
W:352 H:288 Ratio: 1.2222222
W:320 H:240 Ratio: 1.3333334
W:240 H:160 Ratio: 1.5
W:176 H:144 Ratio: 1.2222222

myCamera.setPreviewSize() устанавливает их, и когда я вызываю myCamera.getPreviewSize(), я получаю правильный, который я установил, НО.... Если я устанавливаю вид поверхности на тот же размер, что и предварительный просмотр камеры, я получаю растянутый изображение. например

setPreviewSize(640,480)
getPreviewSize -> I get 640,480
Surface view (640,480) -> Stretched image

Только если я установлю свой вид Surface на 16x9 (1,77777), я получу идеальное изображение.

Surface view (1280,720) -> Perfect image

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

В моем долгом поиске я нашел еще 1 сообщение, которое также относится к этой проблеме, но не ответ, а просто еще одно свидетельство моей проблемы PictureCallback не вызывается, если не используются поддерживаемые размеры[0]

Спасибо


person Iain    schedule 12.03.2013    source источник
comment
Чувак !! У меня такая же проблема. Потратил на это два дня, и я до сих пор не знаю, почему он создает растянутое изображение.   -  person pintaf    schedule 12.04.2013


Ответы (3)


На Nexus 4 есть досадная проблема, когда соотношение сторон предварительного просмотра и соотношение сторон неподвижного изображения связаны вместе, даже если вы никогда не делаете снимок. Если они не совпадают, один из двух искажается (обычно предварительный просмотр, так как это более низкое разрешение).

Если вы хотите использовать предварительный просмотр 4:3, настройте размер неподвижного изображения также на 4:3 перед запуском предварительного просмотра. Например, предварительный просмотр 640x480 с полным размером изображения 8MP (3264 x 2448) на N4 не должен вызывать растяжения для предварительного просмотра.

Используйте Camera.Parameters.setPictureSize для выбора размера изображения; список доступных размеров можно прочитать на странице Camera. Параметры.getSupportedPictureSizes.

person Eddy Talvala    schedule 25.06.2013
comment
Это проблема всех моделей Nexus. - person insomnium_; 12.05.2016
comment
Предложения @Eddy Talvala и beni помогли мне решить мою проблему. Спасибо. Также спасибо Иэну за вопрос. - person Nurhak Kaya; 23.05.2017

Этот метод вычисляет лучший (для меня) размер экрана для каждого устройства. Но у меня такая же проблема, как и у вас, когда я пробовал этот код в Nexus 4. Итак, мое решение состоит в том, чтобы в конце этого метода был особый случай, который получает ширину nexus 4 и вычисляет наилучшую высоту для этого устройство.

Последний случай можно было использовать на всех устройствах. Вы можете удалить первую часть метода.

private void setAspectResolutionCamera(Parameters camParams, int screen_width, int screen_height) {
    boolean chosen_one_resolution = false;

    //Init screen sizes
    width_video = ConstantsCamera.VIDEO_ASPECT_WIDTH;
    height_video = ConstantsCamera.VIDEO_ASPECT_HEIGHT;

    float aspect_ratio = 1f;
    int aspect_width = 6000, aspect_height = 6000;
    List<Size> supported_sizes_list = camParams.getSupportedPreviewSizes();
    for (int i = 0; i < supported_sizes_list.size(); i++) {
        Size size = supported_sizes_list.get(i);

        float aspect = (float) size.height / size.width;
        if (ConstantsCamera.VIDEO_ASPECT_RATIO - aspect <= aspect_ratio && (aspect - ConstantsCamera.VIDEO_ASPECT_RATIO >= 0)) {

            if (screen_width - size.height <= aspect_width && size.height - screen_width >= 0) {

                if (screen_height - size.width < aspect_height) {
                    height_video = size.width;
                    width_video = size.height;
                    aspect_ratio = ConstantsCamera.VIDEO_ASPECT_RATIO - (float) size.height / size.width;
                    aspect_width = screen_width - size.height;
                    aspect_height = screen_height - size.width;

                    chosen_one_resolution = true;


                }
            }
        }
    }

    //Special case
    if (width_video != screen_width && !chosen_one_resolution) {
        height_video = screen_width * height_video / width_video;
        width_video = screen_width;

    }
}
person beni    schedule 25.06.2013

Попробуйте установить размер вашего поверхностного просмотра на основе соотношения параметров камеры, которые вы используете.

person user2267143    schedule 12.04.2013