android image orientation exif

La información de Exif de imagen guardada en Android falla en Marshmallow 6.0.1



orientation (4)

Dado que he experimentado problemas y diferentes comportamientos al leer información EXIF ​​de diferentes fabricantes, le sugiero que obtenga la orientación del URI de la imagen guardada, luego podría guardarlo en la interfaz EXIF.

public static void getImageOrientationFromUri(@NonNull ContentResolver contentResolver, @NonNull Uri uri) { if (uri.getPath() == null) throw new NullPointerException("URI Path should not be null"); float rotationInDegrees = 0; Cursor cursor = contentResolver.query(uri, new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null); if (cursor != null && cursor.moveToFirst()) { int col = cursor.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION); if (col != -1) rotationInDegrees = cursor.getInt(col); cursor.close(); } // here you can save to the EXIF interface getting the apropriate value from rotationInDegrees //If you want to display the image create the bitmap using: //Bitmap sourceBitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri); //Matrix matrix = new Matrix(); //matrix.preRotate(rotationInDegrees); //you can change the signature of the method to return a `Bitmap` and return //Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, false); }

En mi cámara personalizada, necesito guardar la orientación de una imagen capturada. Este código funciona perfectamente para otras versiones de Android. Pero no está funcionando en 6.0.1. El resultado que obtengo es incorrecto después de guardar los atributos en un archivo de imagen.

try { exif = new ExifInterface(pictureFile.getAbsolutePath()); exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); }


Intente esto para guardar la orientación de diferentes ángulos para las imágenes capturadas:

Options options = new Options(); // downsizing image as it throws OutOfMemory Exception for larger // images options.inSampleSize = 8; ExifInterface exif; try { exif = new ExifInterface(fileUri.getPath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, 0); Log.d("EXIF", "Exif: " + orientation); Matrix matrix = new Matrix(); if (orientation == 6) { matrix.postRotate(90); Log.d("EXIF", "Exif: " + orientation); } else if (orientation == 3) { matrix.postRotate(180); Log.d("EXIF", "Exif: " + orientation); } else if (orientation == 8) { matrix.postRotate(270); Log.d("EXIF", "Exif: " + orientation); } myBitmap = BitmapFactory.decodeFile(path_img, options); myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true); } catch (Exception e) { }


Las otras soluciones son reescribir la imagen en lugar de manipular la información EXIF. Sugeriría hacerlo como lo intentaste con las constantes correctas:

try { exif = new ExifInterface(pictureFile.getAbsolutePath()); exif.setAttribute(ExifInterface.TAG_ORIENTATION, Integer.toString(ExifInterface.ORIENTATION_ROTATE_90)); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); }

Según el código fuente, debe utilizar uno de estos valores:

  • ExifInterface.ORIENTATION_UNDEFINED
  • ExifInterface.ORIENTATION_NORMAL
  • ExifInterface.ORIENTATION_FLIP_HORIZONTAL
  • ExifInterface.ORIENTATION_ROTATE_180
  • ExifInterface.ORIENTATION_FLIP_VERTICAL
  • ExifInterface.ORIENTATION_TRANSPOSE
  • ExifInterface.ORIENTATION_ROTATE_90
  • ExifInterface.ORIENTATION_TRANSVERSE
  • ExifInterface.ORIENTATION_ROTATE_270

APOYO ACTUALIZACIÓN DE LA BIBLIOTECA:

Google lanzó ayer la versión 25.1.0 de la biblioteca de soporte con una actualización masiva en el ExifInterface que se centra principalmente en la lectura y escritura de atributos de un archivo de imagen en la última versión de Android. Por favor, eche un vistazo a la SOURCE para el código y comprender más esta actualización.

Espero que esto te ayude