Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Orientación de la imagen desde la galería / la intención de la cámara

Estoy consiguiendo la imagen a mi app de la cámara / galería intención. En muchos teléfonos la imagen que he leído de la intención / Uri ya está girada para corregir la orientación. Por ejemplo N1, Leyenda, Deseo que es el caso.

Pero entonces en algunos teléfonos (por ejemplo Milestone1, GalaxyS) la imagen está siempre en el paisaje más no importa qué manera la imagen fue tomada. Esto significa que en mi retrato del retrato de la aplicación se presenta manera incorrecta al usuario. Intenté leer la información de EXIF ​​de la imagen pero la etiqueta de la orientación es siempre 0. Tiene que haber una manera de descubrir la orientación correcta de la imagen porque en Milestone1 la aplicación de la galería muestra las imágenes del retrato correctamente.

¿Cómo sé si necesito girar la imagen antes de mostrarla al usuario?

¡Gracias por tu ayuda!

  • ¿Cómo conservar la instancia de fragmento de fragmento de reproducción de vídeo después de un cambio de orientación?
  • Resumen: Tome una foto utilizando Intención de la cámara y muestre la foto con la orientación correcta (funciona con todos los dispositivos)
  • Orientación de la pantalla de Android
  • FragmentActivity con ViewPager: Crash en el cambio de orientación
  • Cambiar la orientación, perder todos los elementos de la lista
  • GetRotationMatrix y tutorial de getOrientation
  • Detectar la orientación de un vídeo grabado en android
  • Cómo detectar la orientación del dispositivo Android?
  • 12 Solutions collect form web for “Orientación de la imagen desde la galería / la intención de la cámara”

    La respuesta de Florian está trabajando para las imágenes de la galería.

    El siguiente código funciona para las imágenes capturadas, no lo han intentado con imágenes de galería, pero creo que debería funcionar. Espero que esto ayude a cualquiera.

    Código:

    public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){ int rotate = 0; try { context.getContentResolver().notifyChange(imageUri, null); File imageFile = new File(imagePath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } Log.v(TAG, "Exif orientation: " + orientation); } catch (Exception e) { e.printStackTrace(); } return rotate; } 

    EDIT: Como se puede leer en los comentarios, algunos dispositivos no son compatibles con la información de Exif, no ha comprobado que, pero creo que HTC no. Asegúrese de comprobar qué dispositivos y crear una alternativa.

    El siguiente método devuelve la orientación de una imagen en grados. Funciona con imágenes de la galería. Valores devueltos para:

    • Paisaje normal: 0
    • Retrato normal: 90
    • Paisaje invertido: 180
    • Retrato al revés: 270
    • Imagen no encontrada: -1

    El código:

     public static int getOrientation(Context context, Uri photoUri) { Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); try { if (cursor.moveToFirst()) { return cursor.getInt(0); } else { return -1; } } finally { cursor.close(); } } 
      int rotate = 0; try { File imageFile = new File(sourcepath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } } catch (Exception e) { e.printStackTrace(); } Matrix matrix = new Matrix(); matrix.postRotate(rotate); bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

    Esta es la mejor respuesta que he encontrado, por ramaral. https://stackoverflow.com/a/20480741/2258389
    Funciona muy bien para galería o cámara

    Tienes que crear el objeto de la galería usando primero contentresolver y luego pasar el uri creado a la intención de captura de la imagen. Entonces usted puede mirar los datos del exif, NO los datos de la orientación de la galería.

     Matrix matrix = new Matrix(); ExifInterface exifReader = new ExifInterface(filePath); int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); if (orientation ==ExifInterface.ORIENTATION_NORMAL) { // Do nothing. The original image is fine. } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { matrix.postRotate(90); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { matrix.postRotate(180); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { matrix.postRotate(270); } 

    Tengo el mismo problema con S1, y me di cuenta incluso si se abre la imagen utilizando la aplicación de galería de stock se abrirá en modo horizontal (el teléfono no sabe la orientación correcta para la foto).
    Y si gira el teléfono al retrato en la aplicación de la cámara los iconos (toma la foto, el foco y los ajustes) no girarán, intento que en S2 o cualquier cámara del paisaje / del retrato de la ayuda del dispositivo esos iconos serán rotados.

    Lo que estoy seguro de la aplicación de cámara de archivo no es compatible con tomar fotos en modo prorrate.

    Ya lo hice para un proyecto, porque tuve el mismo problema (Android pensando que sólo va a hacer una foto en el paisaje). Lo que hice fue detectar la orientación del teléfono en ese momento, y luego girar la imagen. Supone que la orientación sigue siendo la misma cuando se recibe la intención.

    Esto parece el mismo problema que se resolvió en esta pregunta: Android: Los mapas de bits cargados desde la galería se rotan en ImageView

    ¡Utilícelo de esta manera!

     private static int exifToDegrees(int exifOrientation) { if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; } return 0; } 

    Y en el código,

     Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true); 

    ¡Sencillo!

    Lo que estoy haciendo: primero compruebe la orientación de la imagen tomada por la cámara utilizando su información de metadatos, y si encontramos esto en el retrato, entonces tenemos que girar la imagen por 90 y mostrar lo contrario sólo mostrar.

    Para obtener la información sobre la orientación de la imagen podemos utilizar la interfaz Exif. ¡Eso es!

    El simple exiftodegree respuestas sólo consistentemente trabajar cuando usted ha tomado una foto y yo lo uso para tal. Para aquellos que tengan problemas con elegir una foto y obtener la orientación correcta, vea mi respuesta aquí: Orientación de la imagen – Android

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.