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

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

Устройство Nexus 4 Android ver: 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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

Этот метод рассчитает лучший (для меня) размер экрана для каждого устройства. Но у меня такая же проблема, как и вы, когда я пробовал этот код в 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;

    }
}

Ответ 3

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