tag studio example etiquetas ejemplos attribute android android-camera screen-orientation

android - studio - title html attribute



¿Es correcto el código de ejemplo de setDisplayOrientation? (1)

El fragmento que ha citado, que utilicé y apliqué en mi proyecto, no es un problema en mis circunstancias.

Para todos los dispositivos (Galaxy Note, Galaxy S III, Galaxy Nexus, Galaxy Ace II, Nexus S) que utilicé para la prueba, info.Orientation todos devuelven 270 en la cámara frontal y 90 en la cámara trasera.

Después de algunas discusiones con el planteador de preguntas, descubrí que no entendía las preguntas, así que divido la respuesta en dos partes.

Para una orientación incorrecta en la vista previa de la cámara, consulte esta solución:

Solución para la orientación incorrecta en la vista previa de la cámara:

Primero, asegúrese de información. La info.Orientation devolverá 270 en la cámara frontal y 90 en la cámara trasera. Luego, intente configurar la actividad de vista previa de su cámara (o una clase similar que maneje la vista previa) orientación al paisaje.

Así, cuando pases por el código, encontrarás:

degree = 90 para la orientación de la pantalla, info.Orientation = 270 para la cámara frontal. Luego obtendrá el result = (270 - 90 + 360) % 360 , result = 180 , lo que significa que girará en el sentido de las agujas del reloj 180 para la vista de la cámara frontal que corregirá el problema al revés de la cámara frontal.

Solución para la orientación incorrecta en los resultados de fotos de la cámara:

Si esta info.Orientation aplica a usted, entonces el problema puede ser:

  1. Para algunos dispositivos Samsung (u otros) (como Galaxy Note, Galaxy SIII), la cámara solo escribirá la etiqueta de orientación en lugar de rotar los píxeles reales.
  2. Si está utilizando la cámara frontal y el código anterior, mostrará la vista previa con la orientación correcta, pero le mostrará la imagen "al revés" si toma la foto.

Solución:

/** * * Get the orientation from EXIF  * @param filepath  * @return orientation  */ public int getExifOrientation(String filepath) { int degree = 0; ExifInterface exif = null; try { exif = new ExifInterface(filepath); } catch (IOException ex) { Log.e("EXIF info", "cannot read exif", ex); } if (exif != null) { int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); if (orientation != -1) { // We only recognize a subset of orientation tag values. switch(orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } } else { degree = 1; } Log.i("EXIF info", "Orientation degrees: " + degree); return degree; }

Entonces

if (isFromCamera) { if (fromFrontCam) { // try change here if the orientation still wrong, -90 means rotate counter-clockwise 90 degrees. matrix.preRotate(-90); } else { matrix.preRotate(90); } } else { // read EXIF data getExifOrientation(path) // don''t forget to handle the situation that some devices won''t write exif data matrix.preRotate(degree); }

La página de documentación de Camera.setDisplayOrientation contiene el siguiente ejemplo de código que indica que su uso "hará que la imagen de la cámara se muestre en la misma orientación que la pantalla":

public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }

Sin embargo, tuve problemas para usarlo, a veces la imagen aparecía al revés. Después de algunas pruebas y errores, encontré que el código correcto sería (reemplazando las últimas 8 líneas del método):

int result = (360 + info.orientation - degrees) % 360; camera.setDisplayOrientation(result);

(Lo que significa que el cálculo para las cámaras posteriores también es correcto para las cámaras frontales). El comentario de "compensar el espejo" es un poco extraño, ya que el reflejo no se puede deshacer girando, esa operación solo intercambia rotaciones de 90 ° y 270 ° Realmente tiene sentido para mí.

Entonces, la pregunta es: ¿es realmente incorrecta la muestra o me estoy perdiendo algo? Lo probé en varios dispositivos, tanto en la cámara trasera como en la delantera y en todas las orientaciones compatibles, por lo que sé que mi código funciona Un pequeño detalle que vale la pena mencionar: todos mis dispositivos devolvieron 90 ° como información de info.orientation .

EDITAR: Here está mi código relacionado con la cámara, lo he probado en un Nexus One y un Samsung Galaxy S Plus. Se utiliza en mi aplicación 3D de seguimiento de cabeza , la vista previa se muestra en la esquina inferior izquierda y siempre debe tener la orientación correcta.

SOLUCIÓN (tipo de): Parece que el código es correcto, pero mi teléfono de prueba (Samsung Galaxy S Plus) devuelve un valor incorrecto para la información de la cámara de la cámara frontal. Hay muchas discusiones relacionadas sobre la vista previa que se muestra al revés en este modelo (ejemplos here y here ). Una forma de solucionarlo es incluir una opción para rotar manualmente la imagen.