ver una saber recuperar programa para online metadatos informacion imagen fotos fotografia fecha como app android camera rotation orientation capture

android - saber - programa para ver metadatos de una imagen



Rotación inexplicable de la cámara de Android en la captura de algunos dispositivos(no en EXIF) (4)

Lo que estoy haciendo parece que debería ser simple, pero aún estoy perdido después de haber leído todas las respuestas posibles de Stackoverflow que puedo encontrar y buscar en Google todos los artículos que puedo encontrar.

Estoy usando una vista previa de SurfaceView y capturando una imagen de una actividad configurada para screenOrientation = "landscape" en mi AndroidManifest.xml.

Seguí el código de muestra de la aplicación de la cámara y pensé que las cosas funcionaban hasta que probé mi aplicación en algunos dispositivos Motorola con 1.5.

Tengo el OrientationEventListener ejecutándose bien y uso la reflexión para ver si establece la rotación como tal:

final int latchedOrientation = roundOrientation(mLastOrientation + 90); Parameters parameters = preview.camera.getParameters(); JPLog.d("Setting camera rotation = %d", latchedOrientation); try { // if >= 2.0 Method method = Camera.Parameters.class.getMethod("setRotation", int.class); if(method != null) { method.invoke(parameters, latchedOrientation); } } catch(Throwable t) { // if < 2.0 parameters.set("rotation", latchedOrientation); } preview.camera.setParameters(parameters);

NexusOne (OS 2.2) - Funciona muy bien. latchedOrientation = 0, imagen OK sin ninguna rotación en el encabezado EXIF.

T-Mobile G1 (OS 1.6) - También funciona muy bien. latchedOrientation = 0, imagen OK.

Motorola Backflip (OS 1.5) - Imagen girada. latchedOrientation = 0, la imagen no tiene rotación EXIF.

Motorola CLIQ (OS 1.5) - Imagen girada. latchedOrientation = 0, la imagen no tiene rotación EXIF.

¿Qué está pasando con estos dispositivos Motorola? Pensé que mi problema era que el controlador de la cámara de Motorola no estaba rotando las imágenes, así que encontré las clases de lectura Sanselan EXIF ​​para Android y me estaba preparando para rotarlas. Lo curioso es que hay encabezados EXIF ​​pero ningún elemento de rotación.

Si configuro la rotación manualmente a 90 grados, las imágenes salen perfectas de los dispositivos Motorola, pero ahora el G1 y el NexusOne tienen imágenes que se giran 90 grados (no es lo que quiero). Tiene que haber algo que no estoy llegando aquí.

Dudo que esto sea un problema de 1.5, o si no, ¿alguien habría publicado información al respecto?


Aquí está el código que utilicé onActivityResult () en mi actividad. La intención devuelta fue para seleccionar una imagen del tipo imagen / *. Funciona bien para mi

Uri imageUri = intent.getData(); String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cur = managedQuery(imageUri, orientationColumn, null, null, null); int orientation = -1; if (cur != null && cur.moveToFirst()) { orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0])); } Matrix matrix = new Matrix(); matrix.postRotate(orientation);


Este es en realidad un problema específico del dispositivo que afecta principalmente a los dispositivos Motorola. Los desarrolladores de Google incluyeron una llamada a setDisplayOrientation en API 8 para setDisplayOrientation el problema. El error principal se archiva here .

Para aquellos que no pueden ir a API 8, las dos soluciones comunes son:

Anular OnDraw
Reemplace onDraw en un grupo de vistas de nivel superior y gire el lienzo 90 grados para compensar la rotación. Tenga en cuenta que aquí hay una advertencia, ya que los eventos táctiles también deberán rotarse.

Usa el modo paisaje
Bloquea la actividad en modo horizontal pero dibuja recursos como si estuvieran en retrato. Esto significa que usted hace su diseño y rota sus recursos de imagen para que parezca que está en modo vertical para que la vista se vea normal. Desafortunadamente, esto hace que sea difícil usar el menú ya que el menú se abrirá horizontalmente.

También he visto a personas usar un controlador de animación para rotar la vista. El inconveniente aquí que no pude superar es que la vista girada no se extiende hasta llenar la pantalla. Vea la respuesta de Georg para una implementación de muestra.


Parece que la sugerencia de ''usar modo paisaje'' es lo único que realmente funciona. Parece que está bien que esto esté en el manifiesto, o se haga a través de una llamada a setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) en la actividad onCreate.


Tuve este problema y utilicé este método para capturar la imagen. (Sin crear una cámara personalizada)

final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); startActivityForResult(intent, 0);

e hizo el resto en onActivityResult (int requestCode, int resultCode, Intent data) {}

Pero la imagen original (la imagen real de la tarjeta SD) era correcta y el mapa de bits se rotaba cuando obtenía esto. Bitmap bmp = BitmapFactory.decodeStream (..

La solución:

try { File f = new File(SD_CARD_IMAGE_PATH); ExifInterface exif = new ExifInterface(f.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { angle = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { angle = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { angle = 270; } Matrix mat = new Matrix(); mat.postRotate(angle); Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, null); Bitmap correctBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true); } catch (IOException e) { Log.w("TAG", "-- Error in setting image"); } catch(OutOfMemoryError oom) { Log.w("TAG", "-- OOM Error in setting image"); }