2012-06-14 16 views
8

Sto aprendo l'app della videocamera con un clic di un pulsante. E visualizzare la foto catturata nella prossima attività. Ma la foto catturata sta ruotando di 90 gradi. Quando visualizzo l'immagine in una vista dopo averla catturata, l'orientamento è sempre orizzontale. Perché la foto non viene mostrata in verticale così com'è quando la foto viene scattata in modalità verticale?L'orientamento delle foto catturate sta cambiando in Android

onClick di un pulsante:

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));  
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT); 

All'interno onActvityresult:

bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png"); 
startActivity(new Intent(this, DisplayActivity.class)); 

Visualizzati catturato foto:

photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp)); 
+3

possibile duplicato [perché immagine catturata utilizzando intento fotocamera viene ruotata su alcuni dispositivi Android] (http://stackoverflow.com/questions/14066038/why-image-captured-using-camera -intento-viene-ruotato-su-alcuni-dispositivi-in-android) – bummi

+0

Rispondi qui http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent-gets-rotated-on- some-devices-in-android –

risposta

15

Ho avuto lo stesso problema per lo più con i telefoni Samsung handsets.Apparently Samsung impostare il tag di orientamento EXIF, piuttosto che ruotando pixels.Reading individuale Bitmap l'utilizzo di BitmapFactory non supporta questo tag. Quello che ho trovato la soluzione a questo problema era l'utilizzo di ExifInterface nel metodo onActivityResult dell'attività. Che controlla l'orientamento associato all'URI dell'immagine catturata dalla fotocamera.

     int rotate = 0; 
         try { 
          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(Common.TAG, "Exif orientation: " + orientation); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

         /****** Image rotation ****/ 
         Matrix matrix = new Matrix(); 
         matrix.postRotate(orientation); 
         Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true); 
+0

Devo ruotare la bitmap alla fine? – Santhosh

+1

è necessario ruotare la bitmap alla fine. –

+0

Grazie. Funziona. Ma ho un piccolo dubbio. Stiamo girando l'immagine dopo averla catturata. Ruota anche la foto catturata in dispositivi diversi da Samsung? Cosa succede se la foto viene catturata correttamente nel dispositivo XXXX? – Santhosh

0

si può solo simpaly ruotarla

ottenere il orietation della immagine ripresa con questo codice in onActvityresult ....

File imageFile = new File(imageUri.toString()); 
     ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
     int rotate = 0; 
     switch(orientation) { 
     case ORIENTATION_ROTATE_270: 
      rotate-=90;break; 
     case ORIENTATION_ROTATE_180: 
      rotate-=90;break 
     case ORIENTATION_ROTATE_90: 
      rotate-=90;break 
     } 
+0

Quali sono i valori di ORIENTATION_ROTATE_270, ORIENTATION_ROTATE_180 e ORIENTATION_ROTATE_90 mentre sto ricevendo non è possibile risolvere l'errore di simbolo per tutti loro. – NarendraJi

1

Ho ottenuto un po 'di lavoro. Quando scatto la foto in modalità Landscape, tutto funziona come prima. Se scatto la foto in modalità verticale, ho bisogno di capovolgere la fotocamera e la foto sembra buona. Se noti che ho modificato un po 'il tuo codice aggiungendo "ExifInterface" davanti a ciascun orientamento. Ho usato il seguente codice:

try { 
     ExifInterface exif = new ExifInterface(filename); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_NORMAL); 
     int rotate = 0; 
     switch(orientation) { 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotate-=90;break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotate-=90;break; 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotate-=90;break; 
      } 
       Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate); 
     } catch (IOException e) { 
      Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e); 
     } 
0

Utilizzare invece Glide. Corregge l'orientamento stesso ed è indipendente dal cellulare che stai utilizzando. Qui \ campione sa

Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury); 
Problemi correlati