Aparat w Androidzie, jak uzyskać najlepszy rozmiar, rozmiar podglądu, Rozmiar obrazu, rozmiar widoku, zniekształcony obraz

Zniekształcenie obrazu podczas mieszania widoku z OpenGL i Kamery Android, aby uzyskać obraz obu przy użyciu metody takepicture. Sprawdziłem i znalazłem, że obraz z kamery został ustawiony na 640x480, a widok openGL i podgląd kamery był ustawiony na 1280x720.

Więc ustawiłem Rozmiar obrazu z aparatu na 1280x720 i wynik był idealny. jednak nie mogę ustawić rozmiaru w kodzie, ponieważ każde urządzenie z Androidem będzie inne, a każde urządzenie ustawienia dla zarówno rozmiar podglądu, jak i rozmiar obrazu muszą być wybrane z listy obsługiwanych rozmiarów.

Jaki jest najlepszy sposób, aby to zrobić, biorąc pod uwagę, że są tu trzy zmienne, rozmiar ekranu układu aktywności, rozmiar podglądu kamery i rozmiar obrazu.

Czy najlepiej jest użyć match_parent lub fitXY dla rozmiaru FrameLayout i pracować tylko z dwiema zmiennymi, rozmiar podglądu i rozmiar obrazu?

Zauważ, że kilka kombinacji szerokości i wysokości w rozmiarach podglądu i rozmiary zdjęć są takie same. na przykład 1280 x 720 występuje zarówno w podglądzie, jak i na zdjęciu, Czy zawsze będzie pasować w obu rozmiarach?

 List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();

 List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();

 // layout in the activity that the cameraView will placed in
 int layoutWidth = frameLayout.getWidth();
 int layoutHeight = frameLayout.getHeight();

Na przykład w jednym tablecie z Androidem po pomiarze są to wyniki dla 3 zmiennych używanych

Rozmiar układu viewGroup w aktywności jako wynik pomiaru

 1280 x 736

Obsługiwane rozmiary zdjęć

 320 x 240
 640 x 480
 1024 x 768
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 920
 1600 x 1200
 2048 x 1536
 2560 x 1440
 2560 x 1536
 2560 x 1920  << native resolution of hardware camera

Obsługiwane rozmiary podglądu

 176 x 144
 320 x 240
 352 x 288
 480 x 320
 480 x 368
 640 x 480
 800 x 480
 800 x 600
 864 x 480
 864 x 576
 960 x 540
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 960
Author: Kevik, 2014-02-10

3 answers

Najczęściej, ale nie zawsze, istnieje zgodność między proporcjami obrazu i proporcjami podglądu. Możesz być pewien, że przynajmniej niektóre z nich są klasycznymi proporcjami 4:3 (np. 640x480). Wsparcie dla 16:9 jest również powszechnie dostępne.

Ekran może mieć różne proporcje. Aby prawidłowo wypełnić obraz z kamery, powszechnie przyjmuje się dodawanie czarnych marginesów (to samo podejście jest stosowane w YouTube). Możesz też przyciąć obraz z kamery, aby wypełnić cały ekran.

Zwróć uwagę, że rozmiar ekranu (podany w specyfikacjach technicznych dla różnych urządzeń) nie zawsze jest rzeczywiście dostępny do wyświetlania obrazu. Na przykład menu systemowe i pasek tytułowy itp. mogą wziąć swój udział w nieruchomości ekranu. Tryb immersyjny jest dostępny na niektórych urządzeniach, a jego zachowanie zależy od wersji systemu. Można się spodziewać, że przyszłe zmiany w Androidzie, np. obsługa drugiego ekranu, sprawią, że gra będzie jeszcze bardziej interesujące .

Odpowiedzi na twoje konkretne pytania:

Czy najlepiej jest użyć match_parent lub fitXY dla rozmiaru FrameLayout i pracować tylko z dwiema zmiennymi, rozmiar podglądu i rozmiar obrazu? - nie .

Czy zawsze jest tak, że będą mecze w obu rozmiarach? - tak, ale może ten rozmiar nie jest optymalny.

Nawet jeśli twój aparat obsługuje różne "szerokie" rozmiary obrazu, 1280x720 podgląd i 2560x1440 zdjęcie może być najlepsze, oba dokładnie w 16:9. Zazwyczaj jakość obrazu w małych rozmiarach nie jest znacząco lepsza niż podgląd w tym samym rozmiarze, więc możesz zapisać ramkę podglądu, Jeśli 1280x720 jest tym, czego naprawdę potrzebujesz.

Jeśli możesz zrezygnować takePicture(), Twoja aplikacja będzie znacznie bardziej responsywna.

 17
Author: Alex Cohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 11:45:26

Myślę, że najlepszym sposobem na uzyskanie {[1] } jest skonfigurowanie kamery do obsługi wszystkich urządzeń z Androidem. Oznacza to, że preview size, picture size, który zdecydujesz się skonfigurować, jest odpowiedni z popularnym formatem obsługiwanym przez wszystkie urządzenia, np. 1280x720 itd.

Jak w poniższych kodach, jest ex. to, czego użyłem.

// start preview with new settings
    try {
        // set preview size and make any resize, rotate or
        // reformatting changes here
        Camera.Parameters parameters = mCamera.getParameters();

        for (Camera.Size size : parameters.getSupportedPictureSizes()) {
            // 640 480
            // 960 720
            // 1024 768
            // 1280 720
            // 1600 1200
            // 2560 1920
            // 3264 2448
            // 2048 1536
            // 3264 1836
            // 2048 1152
            // 3264 2176
            if (1600 <= size.width & size.width <= 1920) {
                parameters.setPreviewSize(size.width, size.height);
                parameters.setPictureSize(size.width, size.height);
                break;
            }
        }
        // Set parameters for camera
        CustomCamera.mCamera.setParameters(parameters);

        Camera.Size size = CustomCamera.mCamera.getParameters().getPictureSize();

        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

Best size zależy od aparatu MP. Więc myślę, że należy użyć domyślnego, jeśli używasz aparatu.

 3
Author: Huy Tower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 03:48:57

Możliwy algorytm:

1) get output area aspect ratio (=szerokość/wysokość)

2) iteracja poprzez Obsługiwane rozmiary:

Wybierz największy z blisko proporcji (+-5%, na przykład) Jeśli nic nie jest blisko lub rozdzielczość jest zbyt niska-po prostu spraw, aby powierzchnia yor (na którą rysujesz ramki) była taka sama jak największy obsługiwany rozmiar i wyśrodkuj ją w widoku nadrzędnym

Howewer, istnieją rozmiary podglądu i rozmiary zdjęć. Jeśli chcesz, aby miały ten sam współczynnik proporcji-to lepszym wyborem jest aby użyć wybranego rozmiaru obrazu proporcje w 1) w ten sposób prawdopodobnie będziesz musiał wyśrodkować powierzchnię w widoku nadrzędnym

Hope that helps)

 1
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 07:24:23