2011-09-28 26 views
22

La aplicación que estoy escribiendo requiere la funcionalidad de la cámara. Así que para aprender acerca de cómo utilizar la cámara, he seguido este script:cámara de Android estirada en modo horizontal

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

He puesto la actividad en mi manifiesto, establecer la orientación de la pantalla para que en modo horizontal.

El problema que tengo es que, cuando la cámara se sostiene hacia los lados (para que mantenga mi Galaxy Tab P1000 en posición horizontal), la vista se estira.

Para ser más específico sobre mi script, utilicé una copia exacta del código que creó Google. Se puede encontrar en android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

El archivo se llama CameraPreview.

Realmente no tengo idea de por qué la pantalla se ve tan estirada. Por supuesto, el formato es extraño y no es cuadrado, pero aun así, cuando se usa la aplicación de cámara predeterminada instalada en el dispositivo, no se deforma en absoluto. Esta cámara deforma la imagen cuando la sostengo de lado y mueve la cámara aunque sea un poco.

enter image description here

enter image description here

Lo que hice fue: contuve galaxy tab para tomar una imagen de un objeto (ordenador portátil en este caso), entonces tomó una foto con mi teléfono de mi Galaxy. En Galaxy, tengo la pantalla de la cámara abierta en la aplicación que estoy haciendo. Esto cuenta para ambas imágenes. Uno que sostengo de costado y otro que sostengo en la vista de retrato. Las fotos son un poco confusas, pero se puede ver que en la imagen del paisaje, la cámara se ha vuelto enormemente ancha.

+3

T_T Entonces, ¿soy el único en el mundo que tiene este problema? <: –

+0

Estoy experimentando este problema también ... – Saty

+0

¡Esta pregunta es una joya escondida!Me costó mucho buscar esto. Habiendo usado todas las palabras clave en google. Esta pregunta salvó mi vida. –

Respuesta

21

Me enfrenté al mismo problema ayer. Después de buscar fuentes de "Cámara", encontré una razón para estirar la vista previa de la cámara.

La razón es: la relación de aspecto SurfaceView (ancho/alto) DEBE ser la misma que la relación de aspecto de tamaño de la cámara utilizada en los parámetros de vista previa. Y si la relación de aspecto no es la misma, tienes una imagen estirada.

Por lo tanto, la solución más rápida es establecer SurfaceView a un tamaño como 320px x 240px, el tamaño más pequeño admitido de Parameters.getSupportedPreviewSizes().

Además, puede consultar las fuentes de aplicaciones estándar de la cámara, utiliza el diseño personalizado para controlar el tamaño de SurfaceView (consulte la función PreviewFrameLayout.java, onMeasure()).

Uso

git clone https://android.googlesource.com/platform/packages/apps/Camera.git

para obtener fuentes de la cámara.

+1

+1 para describir el problema real. Puede encontrar el alto y el ancho de SurfaceView en surfaceChanged, luego use getSupportedPreviewSizes en el objeto de parámetros de la cámara para encontrar la coincidencia más cercana y establecer SurfaceView en el tamaño aceptable que se necesita. –

+0

estoy haciendo esto, pero no funciona. private Camera.Size getBestPreviewSize (int width, int height, parámetros Camera.Parameters) { \t Camera.Size result = null; \t para (tamaño Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t si (Tamano.Width <= ancho && size.height <= altura) { \t \t \t si (resultado == null) { \t \t \t \t resultado = tamaño; \t \t \t} \t \t \t else { \t \t \t \t int resultArea = result.width * result.height; \t \t \t \t int newArea = size.width * size.height; \t \t \t \t si (newArea> resultArea) { \t \t \t \t \t resultado = tamaño; \t \t \t \t} \t \t \t} \t \t} \t} retorno (resultado); } – gIrL

+1

Su código solo busca el tamaño de vista previa más grande que cabe en ancho y alto iniciales. Por supuesto que tiene problemas con la pantalla estirada, porque el más grande no significa "mejor relación de aspecto". Debe ajustar su vista previa Tamaño de vista a ese tamaño "mayor", ajustando su ancho o alto, por lo tanto, esa relación = ancho/alto será la misma para los valores iniciales (ancho y alto) y para los valores finales (ancho de resultado, result.height) – Lord

7
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      camera = Camera.open(); 

      camera.setDisplayOrientation(90); 
      camera.setPreviewDisplay(holder); 
      Camera.Parameters parameters = camera.getParameters(); 
      List<Size> sizes = parameters.getSupportedPictureSizes(); 
      parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0 
      parameters.set("orientation","portrait"); 
      //parameters.setPreviewSize(viewWidth, viewHeight); 
      List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Sólo se necesitan getSupportedPreviewSizes() y guardarlo en un List:

List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 



camera.startPreview(); 

espero que esto le ayuda.

Cuestiones relacionadas