2012-01-09 12 views
8

Estoy escribiendo una pequeña aplicación de Android donde un usuario puede colocar una imagen dentro de la vista previa en vivo de la cámara y tomar una foto de esto. La aplicación combinará las dos imágenes apropiadamente. Todo esto funciona bien.¿Cómo maneja Android las diferencias entre el tamaño/relación de vista previa y el tamaño real de SufaceView?

Entiendo que puede obtener/configurar el PreviewSize usando Camera.getParameters(), supongo que esto está relacionado con el tamaño de la "alimentación de cámara" en tiempo real.

Sin embargo, el tamaño de mi SurfaceView donde se muestra la vista previa de la cámara es diferente de los PreviewSizes informados (y utilizados). Por ejemplo, en el emulador mi SurfaceView disponible resulta ser 360x215, mientras que PreviewSize es 320x240. Aún así, todo el SurfaceView se completa con la vista previa.

Pero la imagen que se genera al final es (¿también?) 320x240. ¿Cómo compensa Android estas diferencias en el tamaño y la relación de aspecto? ¿La imagen está truncada?

¿O simplemente no entiendo de qué se trata la Vista Previa - esto está relacionado con el tamaño de las imágenes generadas, o está relacionado con la "vista previa en tiempo real" que se proyecta en SurfaceView? ¿Hay algún ejemplo de cámara no trivial que se ocupe de esto?

Necesito saber cómo se produce la transformación para, finalmente, copiar/escalar la imagen correctamente en la foto, de ahí estas preguntas.

+0

Es posible que desee echar un vistazo a mi respuesta a mí mismo para una pregunta similar: http://stackoverflow.com/a/18159351/994834 – goto10

Respuesta

1

Estoy tratando de resolver esto por mi cuenta. Esto es lo que he encontrado hasta el momento ..

  • La vista de la superficie tiene una superficie interna llamada mSurface que en realidad se utiliza como cámara de alimentación y la alimentación del codificador. Entonces, este buffer tiene que ser el tamaño real al que desea hacer la grabación.
  • Es posible ajustar el tamaño de este mSurface ser independiente de la SurfaceView utilizando el método setFixedSize
  • Ahora es posible que desee realizar una grabación de alta definición por lo que las necesidades mSurface a 1280x760 de resolución, pero que SurfaceView no puede ser tan grande (Suponiendo que lo está ejecutando en un teléfono con una pantalla WVGA). Intenta establecer una resolución más pequeña que 1280x760, que también mantiene la misma relación de aspecto.
  • Android ahora realiza un cambio de tamaño de la memoria intermedia de alta definición para obtener la vista previa de resolución, no se hace de cultivo, sólo se cambia el tamaño de las SurfaceView reoslutions
  • Así que en este momento tanto el mSurface y la previewSize que ajuste a la cámara es la misma resolución y, por lo tanto, la grabación de video resultante también tendrá la misma resolución.

Dicho esto, todavía estoy luchando para que mi grabadora VGA funcione en Nexus S, está trabajando en un dispositivo LG Maha. :)

Cuestiones relacionadas