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
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.
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.
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)
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