2011-11-03 11 views
11

Próbuję pobrać dostępne rozmiary obrazu z kamery, dzięki czemu mogę dostosować kamerę do preferowanej rozdzielczości obrazu.Aparat z obsługą Androida obsługuje rozmiary obrazów

Aby pobrać Android rozmiar aparatu Użyłem poniższy kod:

camera=Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
for (int i=0;i<sizes.size();i++){ 
    Log.i("PictureSize", "Supported Size: " +sizes.get(i));   
} 

To daje mi następujący wynik, który nie jestem pewien, w jaki sposób przełożyć się na wielkość.

"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 
"Supported size: [email protected]" 

Jeśli ktokolwiek mógłby mi pomóc w zrozumieniu wyniku, bardzo by mi to pomogło, dzięki!

Edit: I skończył rozwiązywania mój problem, wykonując następujące czynności:

camera=Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
Camera.Size result = null; 
    for (int i=0;i<sizes.size();i++){ 
     result = (Size) sizes.get(i); 
     Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); 
    } 

Odpowiedz

11

getSupportedPictureSizes() zwraca List o Camera.Size obiektów. Camera.Size ma height i width elementów danych, które informują o wysokości i szerokości obsługiwanego rozmiaru obrazu.

Here is a sample project, która wykorzystuje powiązany getSupportedPreviewSizes(), aby znaleźć rozmiar podglądu o największym obszarze, który jest mniejszy niż rozmiar SurfaceView.

+0

Dzięki, rozwiązałem teraz mój problem. Jakoś mi brakowało, że dostanę obiekty Camera.Size przez wywołanie getSupportedPictureSizes(). Przykładowy projekt był świetny. –

+0

Nośnik, w swoim projekcie nie ustawiasz rozmiaru obrazu - czy konieczne jest ustawienie rozmiaru obrazu, zastanawiam się? Ponieważ daje mi to poważne problemy z obsługą wielu różnych urządzeń oraz synchronizacją podglądu i rozmiaru obrazu i nie pozwala na to, aby były zbyt małe ze względu na współczynnik proporcji. – AgentKnopf

+0

@Zainodis: "w twoim projekcie nie ustawiasz rozmiaru obrazu" - ta konkretna próbka nie robi zdjęcia. Ustawia tylko podgląd. "czy konieczne jest ustawienie rozmiaru obrazu, zastanawiam się?" - możliwe, że jest domyślny, ale zawsze go ustawiam."Ponieważ daje mi to poważne problemy z obsługą szerokiej gamy różnych urządzeń i synchronizowaniem podglądu oraz rozmiaru obrazu, nie pozwalając na to, aby były zbyt małe ze względu na współczynnik proporcji" - Czuję twój ból, ponieważ mam do czynienia z niektórymi w mojej bibliotece pomocników CWAC-Camera. – CommonsWare

5
Camera camera = Camera.open(); 
Parameters params = camera.getParameters(); 
List sizes = params.getSupportedPictureSizes(); 
for (int i=0;i<sizes.size();i++) { 
    Log.i("PictureSize", "Supported Size: " +sizes.get(i).width + "height : " + sizes.get(i).height);  
} 

Trzeba wziąć wysokość i szerokość od jednego obiektu wielkości

+0

Nie mogłem zmusić go do działania w ten sposób. Zamiast tego wykonałem następujące czynności: zadeklarowałem zmienną wielkości kamery, a następnie wykorzystałem ją do przechowywania każdego obiektu i otrzymałem od niego szerokość/wysokość. Nie jestem do końca pewien, dlaczego nie mogę go wdrożyć tak, jak sugerujesz. –

+0

@krishnabhadra Zastanawiam się, czy pierwszym elementem listy rozmiarów (sizes.get (0)) jest najlepszy rozmiar obrazu, jaki podała kamera? lub po prostu losowy dobry rozmiar obrazu Aparat podany? –

0

To, co skończyło się robi. Ponieważ metoda params.getSupportedPictureSizes() Zwraca listę typu Camera.Size, łatwo było to zrobić:

 List<Camera.Size> sizes = p.getSupportedPictureSizes(); 

     //searches for good picture quality 
     for(Camera.Size dimens : sizes){ 
      if(dimens.width <= 1024 && dimens.height <= 768){ 
       Debug.WriteLine("Width: " + dimens.width + " Height: " + dimens.height); 
       return dimens; 
      } 
     } 

     Debug.WriteLine("Width: " + sizes.get(sizes.size()-1).width + " Height: " + sizes.get(sizes.size()-1).height); 
     //returns the smallest camera size if worst comes to worst 
     return p.getSupportedPictureSizes().get(sizes.size()-1); 

Można uzyskać List<Camera.Size> i przemierzać go jak każdej innej listy. Obiekt Camera.Size ma własność width i height.

Zgłaszanie tego w ten sposób może być lepsze niż rzutowanie każdego elementu listy na typ Camera.Size w pętli.

Na moich urządzeniach, jeśli spojrzę na sizes.get(0), będzie miał najwyższą rozdzielczość, a sizes.get(sizes.size()-1) ma najniższą. Nie jestem jednak pewien, czy to prawda na wszystkich urządzeniach. Ktoś ma wgląd w to?

+1

Na moim Samsung Galaxy Note II najmniejszy rozmiar to indeks 0, awans. Więc nie jest tak samo na wszystkich urządzeniach. –

+0

Tak, telefony Samsung są trudne w obsłudze, jeśli chodzi o aparat. Są też inne problemy, takie jak odwracanie obrazów (bez interfejsów exif). Widziałem, jak ludzie próbują wykryć, czy urządzenie jest urządzeniem Samsung i czy działają na nim funkcje. Co za ból, mam rację? – Nlinscott

+0

Tak, bardzo to smutne. Zwłaszcza, że ​​pisanie sterowników powinno być częścią systemu operacyjnego. –

1

Oto przykład wyszukiwania wielkości, która ma na przykład maksymalny rozmiar (1024 * 768).

   List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 
       //searches for good picture quality 
       Camera.Size bestDimens = null; 
       for(Camera.Size dimens : sizes){ 
        if(dimens.width <= 1024 && dimens.height <= 768){ 
         if (bestDimens == null || (dimens.width > bestDimens.width && dimens.height > bestDimens.height)) { 
          bestDimens = dimens; 
         } 
        } 
       } 
       parameters.setPictureSize(bestDimens.width, bestDimens.height); 
       camera.setParameters(parameters); 
Powiązane problemy