2016-08-04 1 views
0

J'utilise Camera intention pour capturer une photo sur android, lorsque l'intention de onActivityResult renvoie un bitmap, il a une mauvaise orientation sur certains téléphones. Je sais qu'il existe des moyens de résoudre ce problème, mais toutes les solutions que j'ai vues parlent d'image stockée dans un fichier. Ce que je récupère de l'intention est directement une image bitmap. Je veux savoir comment je peux obtenir des données exif d'un bitmap et ensuite corriger son orientation. Je répète que j'ai vu des réponses qui traitent de fichiers et non de bitmap, alors s'il vous plaît, considérez ceci avant de voter.Bitmap reçu de la caméra à l'orientation incorrecte/pivoté

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     startActivityForResult(takePictureIntent, Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

et le résultat est le suivant

Bundle extras = data.getExtras(); 
Bitmap imageBitmap = (Bitmap) extras.get("data"); 

Comment obtenir l'orientation et la faire pivoter.

+2

double possible de [pourquoi l'image capturée à l'aide l'intention de la caméra se fait tourner sur certains appareils Android en] (http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent- obtient-tourné-sur-certains-appareils-dans-android) –

+0

@Mik elPascual cette question doest spécifier comment obtenir exif d'un bitmap c'est ce que j'ai dit dans op –

+1

Vous pouvez voir cette [réponse] (http://stackoverflow.com/a/11081918/5061288), je pense que c'est utile. –

Répondre

0

MISE À JOUR

Exif est un format de fichier qui insère des données d'information au format JPEG. https://www.media.mit.edu/pia/Research/deepview/exif.html

Et Bitmap est donnée de données structior détient des données de pixel de ligne, pas d'info exif.
Donc, je pense qu'il est impossible d'obtenir des informations exif de Bitmap.
Il n'y a pas de méthode pour obtenir des infos exif.
https://developer.android.com/reference/android/graphics/Bitmap.html

ORIGINAL

Je suis d'accord avec @DzMobNadjib. Je pense que l'info de rotation est seulement en exif. Pour prendre exif, je vous recommande de prendre les mesures suivantes.

1. Démarrez l'activité de la caméra avec le chemin du fichier.

Voir [Enregistrer la photo dans sa taille] capture de .

Vous pouvez démarrer l'activité de la caméra avec le chemin du fichier. L'activité de la caméra enregistre l'image dans le chemin du fichier que vous avez passé.

2. Dans 'onActivityResult', Suivre this answer (comme suggéré @DzMobNadjib)

Votre code sera comme ceci:
(Désolé, je ne suis pas testé S'il vous plaît lire carefuly et suivre la réponse ci-dessus.)

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      Uri uri = data.getData(); 
      Bitmap bitmap = getAdjustedBitmap(uri); 
     } 
    } 
} 

private Bitmap getAdjustedBitmap(Uri uri) { 
    FileInputStream is = null; 
    try { 
     ExifInterface exif = new ExifInterface(uri.getPath()); 

     int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

     int rotationInDegrees = exifToDegrees(rotation); 

     Matrix matrix = new Matrix(); 
     if (rotation != 0f) { 
      matrix.preRotate(rotationInDegrees); 
     } 

     is = new FileInputStream(new File(uri.getPath())); 
     Bitmap sourceBitmap = BitmapFactory.decodeStream(is); 

     int width = sourceBitmap.getWidth(); 
     int height = sourceBitmap.getHeight(); 

     return Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
      } 
     } 
    } 
    return null; 
} 

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; 
} 
+0

Ma question est que je peux obtenir l'info exif de bitmap –

+0

Ok, j'ai mis à jour ma réponse – nshmura