studio permission open developers developer custom android camera mapping image preview

permission - Cartografía de vista previa de la cámara Android a la imagen final



open camera android developer (1)

Hemos estado creando una actividad personalizada para la cámara Android donde se superpone un rectángulo dentro de la vista previa de la cámara y cuando se captura la foto (presionando un botón), queremos recortar el área rectangular correspondiente de la imagen final. El problema es que aún no hemos descubierto cómo Android asigna la pantalla de vista previa a la imagen final.

Hemos probado la siguiente fórmula, pero solo funciona en algunos casos:

Sean xey las coordenadas de la esquina superior izquierda del rectángulo, como se muestra en la vista previa de la cámara.

Permitir preview_width y preview_height sea el ancho y el alto de la vista previa de la cámara. Estos se obtienen utilizando una función getBestPreviewSize (), que recorre los tamaños de Vista previa compatibles y selecciona el más grande. Supongamos que son 1280 y 720.

Permita que picture_width y picture_height sean el ancho y el alto de la imagen final admitidos por la cámara. Para nuestro propósito, supongamos que esto es 1632 * 1224 (en un Sony Ericsson XPERIA esto corresponde a los 2 MP).

Queremos encontrar x_map, y_map que son la xey del rectángulo de recorte de la imagen final.

Luego, por la regla de la analogía, la fórmula que utilizamos fue:

x_map = picture_width * x / preview_width; y_map = picture_height * y / preview_height;

Sin embargo, esto no parece funcionar en todos los casos. Hemos descubierto que cuando las dimensiones de la pantalla del teléfono son similares al tamaño de vista previa, esta fórmula casi funciona (aproximadamente, con un pequeño error).

Sin embargo, para otros casos como el teléfono Sony XPERIA, donde las dimensiones de la pantalla son: ancho: 480 y alto: 854, la fórmula falla.

Por ejemplo, para x = 50, entonces x_map = 1632 * 50/1280 = 63.75 Sin embargo, este número, como se muestra en el área rectangular recortada de la imagen final, no corresponde realmente al rectángulo en el área de vista previa. Está muy lejos. Nuestra fórmula no tiene en cuenta las dimensiones de la pantalla, aunque la experimentación con la modificación para dar cuenta de ellos, no ha producido ningún resultado deseable.

Sospechamos que el mapeo entre el tamaño de la vista previa y la imagen final de alguna manera tiene en cuenta las dimensiones de la pantalla, pero no se ha descubierto exactamente cómo, ya que no hay documentación y después de buscar respuestas en la web no surgió nada relevante. Creemos que hay un cierto factor de escala y relación de aspecto que debemos tener en cuenta antes de aplicar la regla de la analogía, para que la fórmula funcione bien.

¿Conoces una fórmula correcta para lo anterior?


Primero, obtenga el tamaño de imagen más grande devuelto por Camera.getSupportedPictureSizes : esta es la resolución nativa de su cámara desde la que puede determinar la relación de aspecto original. Cualquier tamaño de imagen o tamaño de vista previa con una relación de aspecto diferente se recortará de acuerdo con `Matrix.ScaleToFit.CENTER ''.

Ver también: https://.com/a/18159351/994834