2012-10-04 7 views
26

Sto impostando un'immagine sull'immagine vista dalla galleria (album della fotocamera). Se l'immagine selezionata ha l'orientamento orizzontale, viene visualizzata perfettamente ma se l'immagine è in modalità verticale (cioè l'immagine è stata scattata in modalità verticale) sta visualizzando l'immagine con una rotazione di 90 gradi. Ora sto cercando di scoprire l'orientamento prima di impostare l'immagine, ma tutte le immagini hanno lo stesso orientamento e la stessa larghezza-altezza. Qui è il mio codice:Android: come rilevare l'orientamento dell'immagine (verticale o orizzontale) selezionato dalla galleria mentre si imposta su una visualizzazione di immagini?

Uri selectedImage = intent.getData(); 
if (selectedImage != null) { 
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); 

    int str = new ExifInterface(selectedImage.getPath()).getAttributeInt("Orientation", 1000); 
    Toast.makeText(this, "value:" + str, Toast.LENGTH_LONG).show(); 
    Toast.makeText(this, "width:" + bitmap.getWidth() + "height:" + bitmap.getHeight(), Toast.LENGTH_LONG).show(); 

portrait mode landscape mode

+0

qualcuno mi può aiutare Ho lo stesso issue..http: //stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

risposta

47

Usa ExifInterface per un'immagine rotazione. Utilizzare questo metodo per ottenere il valore corretto per ruotare l'immagine acquisita dalla fotocamera.

public 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.i("RotateImage", "Exif orientation: " + orientation); 
     Log.i("RotateImage", "Rotate value: " + rotate); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return rotate; 
} 

E inserire questo codice nel metodo di risultato di attività e ottenere il valore per ruotare l'immagine ...

String selectedImage = data.getData(); 
String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
cursor.moveToFirst(); 

int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
filePath = cursor.getString(columnIndex); 
cursor.close(); 

int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath); 

Spero che questo aiuti ..

+2

exif.getAttributeInt (ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); restituisce sempre il valore 0 per qualsiasi immagine di orientamento. – sarabhai05

+0

scusa stavo facendo un errore. il tuo approccio sta funzionando per me. Anche data.getData() restituisce Uri non String, pls ha un aspetto nel codice ur. – sarabhai05

+6

@Deepak Perché devo chiamare 'context.getContentResolver(). NotifyChange (imageUri, null)'? –

4

Questo sta anche lavorando per me:

String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; 
Cursor cur = getContentResolver().query(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); 
+0

puoi aggiungere un codice completo? Thanx –

+0

quale parte del codice vuoi? – sarabhai05

-1

Questo lavoro per me:

private String getOrientation(Uri uri){ 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    String orientation = "landscape"; 
    try{ 
     String image = new File(uri.getPath()).getAbsolutePath(); 
     BitmapFactory.decodeFile(image, options); 
     int imageHeight = options.outHeight; 
     int imageWidth = options.outWidth; 
     if (imageHeight > imageWidth){ 
      orientation = "portrait"; 
     } 
    }catch (Exception e){ 
     //Do nothing 
    } 
    return orientation; 
} 
+3

Su alcuni dispositivi (come s3 e s4) la larghezza è maggiore dell'altezza anche se l'immagine è verticale.questo perché non usiamo questa soluzione anche se sembra pulita e perfetta. –

3
     if(bm.getWidth() > bm.getHeight()) 
         { 
          Bitmap bMapRotate=null; 
          Matrix mat=new Matrix(); 
          mat.postRotate(90); 
         bMapRotate = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(),bm.getHeight(), mat, true); 
         bm.recycle(); 
         bm=null; 
         imageDisplayView.setImageBitmap(bMapRotate); 
         }else 
         imageDisplayView.setImageBitmap(bm); 
+1

Su alcuni dispositivi (come s3 e s4) la larghezza è maggiore dell'altezza anche se l'immagine è verticale. questo perché non usiamo questa soluzione anche se sembra pulita e perfetta. –

+0

@JesusDimrix Sì, potrebbe essere un caso. Ma se l'immagine non ha informazioni di orientamento nella sua intestazione, allora possiamo usare in questo modo. – ultimate

+0

stavo impazzendo cercando di farlo funzionare a dovere è abbastanza buono per me galassia s cosa? –

1

Ecco una grande soluzione mi sono imbattuto in questo:>https://stackoverflow.com/a/34241250/8033090

Una soluzione linea:

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

o

Picasso.with(context).load("file:" + photoPath).into(imageView); 

questo sarà rilevare automaticamente immagine Posto di rotazione e nel corretto orientamento

Picasso è una libreria molto potente per la gestione delle immagini nella vostra applicazione include: le trasformazioni di immagini complesse con l'uso di memoria minimo. 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.

Problemi correlati