2011-11-03 18 views
11

Estoy tratando de recuperar los tamaños de imagen de la cámara disponibles, por lo que puedo ajustar la cámara a mi resolución de imagen preferida.Tamaños de imagen compatibles con la cámara Android

Para recuperar el tamaño de la cámara de Android que he usado el siguiente código:

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));   
} 

Esto me da el siguiente resultado, que no estoy seguro de cómo se traduce en un tamaño.

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

Si alguien pudiera ayudarme a entender la salida me ayudaría mucho, ¡gracias!

Editar: Terminé la solución de mi problema de la siguiente manera:

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); 
    } 

Respuesta

11

getSupportedPictureSizes() devuelve un List de Camera.Size objetos. Camera.Size tiene height y width miembros de datos que le dicen la altura y el ancho del tamaño de la imagen compatible.

Here is a sample project que usa el getSupportedPreviewSizes() relacionado para encontrar el tamaño de vista previa con el área más grande que es más pequeña que el tamaño de SurfaceView.

+0

Gracias resolvió mi problema ahora. De alguna manera me había perdido que obtendría objetos Camera.Size llamando a getSupportedPictureSizes(). El proyecto de muestra fue genial. –

+0

CommonsWare, en su proyecto no está configurando el tamaño de la imagen, ¿es necesario establecer el tamaño de la imagen, me pregunto? Porque me da serios problemas para admitir una amplia gama de dispositivos diferentes y mantener la vista previa y el tamaño de la imagen sincronizados y no dejar que se vuelvan demasiado pequeños debido a la relación de aspecto. – AgentKnopf

+0

@Zainodis: "en su proyecto no está configurando el tamaño de la imagen": esa muestra en particular no toma una fotografía. Solo configura la vista previa. "¿Es incluso necesario establecer el tamaño de la imagen que me pregunto?" - es posible que haya un defecto, pero siempre configuro uno."Porque me está dando serios problemas para soportar una amplia gama de dispositivos diferentes y mantener la vista previa y el tamaño de la imagen sincronizados y no dejar que se vuelvan demasiado pequeños debido a la relación de aspecto" - Siento tu dolor, ya que trato con algo de eso en mi biblioteca de ayuda 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);  
} 

usted tiene que tomar altura y la anchura de un objeto del tamaño

+0

No pude lograr que funcionara de esa manera. Terminé haciendo lo siguiente en su lugar: declaró una variable de tamaño de cámara y luego la usé para contener cada objeto y obtuve el ancho/alto de eso. No estoy seguro de por qué no puedo implementarlo como sugirió. –

+0

@krishnabhadra Me pregunto si el primer elemento de los tamaños de lista (sizes.get (0)) es el mejor tamaño de imagen que la cámara ofrece? o simplemente una buena cámara de tamaño de imagen al azar? –

0

Esto es lo que terminé haciendo. Dado que el método params.getSupportedPictureSizes() devuelve una lista de tipo Camera.Size, que era fácil de hacer esto:

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

Usted puede obtener una List<Camera.Size> y atravesar como cualquier otra lista. el objeto Camera.Size tiene una propiedad width y height.

Declarar su List de esta manera podría ser mejor que enviar cada elemento de la lista al tipo Camera.Size dentro de un bucle.

En mis dispositivos, si miro a sizes.get(0), tendrá la resolución más alta, mientras que sizes.get(sizes.size()-1) tiene la más baja. Sin embargo, no estoy seguro de si esto es cierto en todos los dispositivos. Alguien tiene una idea de eso?

+1

En mi Samsung Galaxy Note II, el tamaño más pequeño es el índice 0, que sube. Por lo tanto, no es lo mismo en todos los dispositivos. –

+0

Sí Los teléfonos Samsung son difíciles de usar cuando se trata de la cámara. También existen otros problemas, como que las imágenes se volteen (sin interfaces exif). He visto a gente tratar de detectar si el dispositivo es un dispositivo de Samsung y ejecutar funciones basadas en eso. Qué dolor, ¿estoy en lo cierto? – Nlinscott

+0

Sí, muy triste todo esto. Especialmente porque los controladores de escritura deberían ser parte del sistema operativo. –

1

Aquí hay un ejemplo de cómo buscar el tamaño que se acerca a su tamaño máximo (1024 * 768), por ejemplo.

   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); 
Cuestiones relacionadas