2016-08-04 40 views
0

Ich benutze Camera Intent, um ein Foto auf Android zu erfassen, wenn Absicht von onActivityResult Bitmap zurückgibt, hat es falsche Ausrichtung auf einigen Telefonen. Ich weiß, es gibt Möglichkeiten, dies zu beheben, aber alle Lösungen, die ich gesehen habe, sprechen über das Bild in der Datei gespeichert. Was ich von Absicht abrufe, ist direkt Bitmap-Bild. Ich möchte wissen, wie ich exif Daten von einer Bitmap erhalten und dann seine Orientierung korrigieren kann. Ich wiederhole, ich habe Antworten gesehen, die sich mit Datei und nicht mit Bitmap beschäftigen, also bitte bedenken Sie dies vor der Abstimmung.Bitmap von der Kamera empfangen hat falsche Orientierung/gedreht

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

und das Ergebnis ist als

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

folgt Wie Orientierung bekommen und es drehen.

+2

Mögliches Duplikat [warum Absicht Bild aufgenommen mit der Kamera auf einigen Geräten in android gedreht wird] (http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent- gets-route-auf-einigen-geräten-in-android) –

+0

@Mik elPasual, dass Frage angeben, wie exif einer Bitmap, das ist, was ich in Op –

+1

gesagt habe Sie können dies [Antwort] (http://stackoverflow.com/a/11081918/5061288), ich denke, es ist hilfreich. –

Antwort

0

UPDATE

Exif ist ein Dateiformat, das einige Informationsdaten zu JPEG einfügt.

Und Bitmap ist Datenstruktur Daten enthält Zeile Pixeldaten, keine Exif-Info.
Also ich denke, es ist unmöglich, Exif-Informationen von Bitmap zu bekommen.
Es gibt keine Methode, Exif-Informationen zu erhalten.
https://developer.android.com/reference/android/graphics/Bitmap.html

ORIGINAL

ich mit @DzMobNadjib zustimmen. Ich denke, die Information der Rotation ist nur in Exif. Um Exif zu nehmen, empfehle ich Ihnen, folgende Schritte zu unternehmen.

1. Starten Sie die Kameraaktivität mit dem Dateipfad.

Siehe [Speichern Sie das Photo] Erfassung von this document.

Sie können die Kameraaktivität mit dem Dateipfad starten. Die Kameraaktivität speichert das Bild in dem Dateipfad, den Sie übergeben haben.

2. In 'onActivityResult' Folgen this answer (als @DzMobNadjib vorgeschlagen)

wird Ihr Code wie folgt sein:
(Leider habe ich nicht getestet habe carefuly Bitte lesen und befolgen Sie die obige Antwort.

)
@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

Meine Frage ist, kann ich die Exif-Informationen von Bitmap –

+0

Ok, habe ich meine Antwort aktualisiert – nshmura