2013-12-09 15 views
29

Ho passato alcuni dei collegamenti per ottenere il corretto orientamento dell'immagine dell'immagine selezionata dalla galleria di immagini predefinita per funzionare standard in tutti i dispositivi l'exif tag restituisce sempre 0.Come ottenere l'orientamento corretto dell'immagine selezionata dalla galleria Immagine predefinita

EXIF orientation tag value always 0 for image taken with portrait camera app android

Exif orientation tag returns 0

Exif data TAG_ORIENTATION always 0

http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-android/

Come per ottenere una soluzione esatta che funziona su tutti i dispositivi?

+0

ho la risposta. http://stackoverflow.com/questions/29971319/image-orientation-android/32747566#32747566 –

+0

Ecco una grande soluzione di una linea mi sono imbattuto in questo:> https://stackoverflow.com/a/34241250/8033090 E ' può richiedere un secondo per caricare, ma ho appena messo del testo dietro la vista dell'immagine che dice "Caricamento immagine" e quando l'immagine viene caricata copre il testo. –

risposta

2

Per me ExifInterface funzionato abbastanza bene in questo modo:

ExifInterface exifInterface = new ExifInterface(imagePath); 
degree = Integer.parseInt(exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION)); 

oppure si può cercare di ottenere i dettagli di un'immagine utilizzando MediaStore come questo:

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])); 
} 

soluzione simile: ExifInterface always returns 1

Spero che aiuti .. :)

90

Se l'immagine (foto) è stata scattata da un programma creato dall'utente, è necessario impostare Parameters.setRotation con il valore di rotazione corretto.

Questo, a seconda dell'unità telecamera, ruota l'immagine prima di salvare o salvare il valore di rotazione su exag TAG_ORIENTATION.

Pertanto, se TAG_ORIENTATION è nullo o zero, l'immagine sono nell'orientamento corretto, altrimenti si deve ruotare l'immagine secondo il valore in TAG_ORIENTATION.

CODICE

Get orientamento da EXIF:

ExifInterface exif = null; 
try { 
    exif = new ExifInterface(path); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
             ExifInterface.ORIENTATION_UNDEFINED); 

Get bitmap ruotato:

Bitmap bmRotated = rotateBitmap(bitmap, orientation); 

Metodo per ruotare bitmap:

public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) { 

    Matrix matrix = new Matrix(); 
    switch (orientation) { 
     case ExifInterface.ORIENTATION_NORMAL: 
      return bitmap; 
     case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: 
      matrix.setScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      matrix.setRotate(180); 
      break; 
     case ExifInterface.ORIENTATION_FLIP_VERTICAL: 
      matrix.setRotate(180); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_TRANSPOSE: 
      matrix.setRotate(90); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      matrix.setRotate(90); 
      break; 
     case ExifInterface.ORIENTATION_TRANSVERSE: 
      matrix.setRotate(-90); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      matrix.setRotate(-90); 
      break; 
     default: 
      return bitmap; 
    } 
    try { 
     Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
     bitmap.recycle(); 
     return bmRotated; 
    } 
    catch (OutOfMemoryError e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Come posso ottenere l'orientamento dell'immagine dalla galleria dell'immagine selezionata puoi guidarmi per favore – ramsraj111

+0

Ho aggiunto del codice alla mia risposta. – ramaral

+20

utilizzando l'exif sempre restituendo 0 solo – ramsraj111

2

Ho seguito l'ultima risposta e ho provato a creare un sistema per gestire le immagini, ruotare, ridimensionare, memorizzare e caricare in ImageViews e posso dire che è un inferno. Anche quando tutto è stato fatto, alcuni crash causano talvolta problemi di OutOfMemory in alcuni dispositivi. La risposta è corretta ma è difficile gestire Bitmap in Android.

Il mio punto è di non reinventare la ruota, ha un design perfetto. Google stesso ti incoraggia a utilizzare Glide. Funziona in una sola riga, super facile da usare, leggero nelle dimensioni e nel numero di funzioni, gestisce EXIF ​​per impostazione predefinita e utilizza la memoria come un incantesimo ..È semplicemente magia nera codificato;)

io non sono sicuro se Picasso gestisce anche EXIF, ma v'è una rapida introduzione a entrambi:

https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

Il mio consiglio: non perdete il vostro tempo e usarli. È possibile risolvere il problema in una sola riga:

Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 
+3

Questo non funziona se avete il problema dell'immagine della telecamera anteriore capovolta sulla maggior parte dei dispositivi con Glide non risolve l'orientamento – NMP

+1

io uso scivolata e si pretende molto di gestire l'orientamento basato etichetta Exif –

+0

Davvero quale versione si utilizza..? Sono abbastanza sicuro che abbia risolto il mio problema in passato. –

1

Per chi arriva lungo questo post, assicuratevi di usare l'exifinterface dalla libreria di supporto Android che è stato introdotto nel dicembre 2016:

compile "com.android.support:exifinterface:25.1.0" // or newer 

Dettagli a proposito di questa libreria può essere trovato nel secondo Android Developers Blog postale: Introducing the ExifInterface Support Library

hanno incluso anche un codice di esempio per gestire le informazioni di rotazione memorizzate nell'interfaccia exif:

int rotation = 0; 
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

switch (orientation) { 
    case ExifInterface.ORIENTATION_ROTATE_90: 
    rotation = 90; 
    break; 
    case ExifInterface.ORIENTATION_ROTATE_180: 
    rotation = 180; 
    break; 
    case ExifInterface.ORIENTATION_ROTATE_270: 
    rotation = 270; 
    break; 
}