studio open manejo example developer custom camara android camera surfaceview

android - open - Cómo conciliar la diferencia en la relación de aspecto entre el tamaño de vista previa de la cámara y el tamaño de la imagen



open camera android developer (2)

Tengo una aplicación de cámara que selecciona un tamaño de vista previa basado en las características de mi diseño (principalmente relación de aspecto) y luego selecciona un tamaño de imagen basado en otras restricciones (dimensiones mínimas). Esto a menudo resulta en una imagen con una relación de aspecto diferente a la vista previa.

Esto no es un problema en sí mismo, pero necesito asignar un rectángulo en mi vista previa a un rectángulo equivalente en la imagen para que pueda extraer la misma área de la foto final que estaba visible en la vista previa cuando se tomó la foto.

Entiendo que tener diferentes relaciones de aspecto significa que habrá partes de los rectángulos que no se superponen, pero no estoy trabajando lo suficientemente cerca como para que esto sea un problema.

Si no es posible saber cómo se ven directamente la vista previa y el mapa de la foto, ¿hay alguna manera de determinar cómo se asignan cada uno a la cámara original? Si pudiera detectar programáticamente la relación de aspecto de la cámara nativa, podría determinar el esquema de recorte.


No estoy muy seguro de lo que está pidiendo, pero el tamaño de vista previa no está determinado por su diseño. Cómo se muestra está determinado por el diseño. Supongo que está utilizando un SurfaceView para guardar su objeto de vista previa / cámara.

Puede obtener el tamaño de vista previa real con este método http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getPreviewSize ()

Y, además, puede obtener las dimensiones de su vista previa "mostrada" utilizando el ancho y la altura que obtiene de OnSurfaceChanged () (Es parte de la devolución de llamada del titular de la superficie)

No estoy seguro de lo importante que es eso. Pero el punto principal es que ahora conoces el tamaño de vista previa real de getPreviewSize () puedes hacer cálculos matemáticos y obtener tus puntos en consecuencia.

Esto coincide perfectamente con onPreviewFrame (datos de byte [], cámara de la cámara) http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

Los datos de byte [] están en el formato YUV, que probablemente necesitará convertir a un mapa de bits antes de perder el tiempo. Pero aparte de eso, tendrá las mismas dimensiones que obtiene al llamar a getPreviewSize


Después de algunos intentos de prueba y error, he llegado a las siguientes conclusiones provisionales:

  1. El tamaño de imagen más grande proporcionado por Camera.Parameters.getSupportedPictureSizes representa la resolución nativa de la cámara.

  2. El contenido de otros tamaños de imagen, así como los tamaños de vista previa proporcionados por Camera.Parameters.getSupportedPreviewSizes , coincidirá con el contenido nativo cuando se Matrix.ScaleToFit.CENTER como se describe para Matrix.ScaleToFit.CENTER . (básicamente escala desde el centro hasta que arriba / abajo o izquierda / derecha llegue a los límites de la resolución nativa. El recorte ocurre en la dimensión que no alcanza los límites de la resolución nativa si las relaciones de aspecto no coinciden

Entonces, dado que mi solución era escalar primero el rectángulo de selección de vista previa al tamaño de imagen de la cámara nativa. Luego, ahora que sé qué área de la resolución nativa contiene el contenido que quiero, puedo hacer una operación similar para luego escalar ese rectángulo en la resolución nativa a la imagen más pequeña que se capturó realmente por Camera.Parameters.setPictureSize .