wake-up-neo.net

Bildorientierung aus Galerie/Kameraabsicht

Ich bekomme Bilder von meiner Kamera/Galerie-Absicht zu meiner App. Bei vielen Handys wird das Bild, das ich aus der Absicht/Uri gelesen habe, bereits zur korrekten Ausrichtung gedreht. Zum Beispiel N1, Legende, Wunsch ist das der Fall.

Bei einigen Telefonen (z. B. Milestone1, GalaxyS) ist das Bild jedoch immer im Querformat, unabhängig davon, auf welche Weise das Bild aufgenommen wurde. Dies bedeutet, dass in meiner Anwendung das Portraitbild dem Benutzer falsch dargestellt wird. Ich habe versucht, die EXIF-Informationen des Bildes zu lesen, aber das Ausrichtungs-Tag ist immer 0. Es muss eine Möglichkeit geben, die richtige Ausrichtung des Bildes herauszufinden, da in Milestone1 die Galerie-Anwendung die Porträtbilder korrekt anzeigt. 

Woher weiß ich, ob ich das Bild selbst drehen muss, bevor es dem Benutzer angezeigt wird?

Danke für deine Hilfe!

32
Juhani

Florian Antwort arbeitet für Galeriebilder. 

Der folgende Code funktioniert für aufgenommene Bilder, habe es nicht mit Galerie-Bildern versucht, aber ich glaube, dass es funktionieren sollte. Hoffe, das hilft jedem.

Code:

public static 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.v(TAG, "Exif orientation: " + orientation);
     } catch (Exception e) {
         e.printStackTrace();
     }
    return rotate;
 }

EDIT: Wie man in den Kommentaren nachlesen kann, unterstützen manche Geräte keine Exif-Informationen. Ich habe nicht geprüft, welche nicht, aber ich glaube, HTC tut das nicht. Vergewissern Sie sich, welche Geräte verwendet werden, und erstellen Sie eine Alternative.

25
eric.itzhak

Die folgende Methode gibt die Ausrichtung eines Bildes in Grad zurück. Es funktioniert mit Bildern aus der Galerie. Rückgabewerte für:

  • normale Landschaft: 0
  • normales Porträt: 90
  • umgekehrte Landschaft: 180
  • porträt auf dem Kopf stehend: 270
  • bild nicht gefunden: -1

Der Code:

public static int getOrientation(Context context, Uri photoUri) {
    Cursor cursor = context.getContentResolver().query(photoUri,
            new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
            null, null, null);

    try {
        if (cursor.moveToFirst()) {
            return cursor.getInt(0);
        } else {
            return -1;
        }
    } finally {
        cursor.close();
    }
}
16
        int rotate = 0;
        try {
            File imageFile = new File(sourcepath);
            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;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Matrix matrix = new Matrix();
        matrix.postRotate(rotate);
        bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
3
vineet pal

Dies ist die beste Antwort, die ich gefunden habe, von Ramaral. https://stackoverflow.com/a/20480741/2258389
Funktioniert hervorragend für Galerie oder Kamera

2
Jason

Ich habe dasselbe Problem mit S1, und ich habe festgestellt, dass das Bild auch im Querformat geöffnet wird, wenn Sie das Bild mit der Stock-Galerie-App öffnen (das Telefon kennt nicht die richtige Ausrichtung für das Foto).
Wenn Sie das Telefon in der Kamera-App auf Hochformat drehen, werden die Symbole (Aufnahme, Fokus und Einstellungen) nicht gedreht. Versuchen Sie in S2 oder einer anderen Kamera- oder Querformat-Kamera, dass diese Symbole gedreht werden.

Ich bin sicher, dass die Standardkamera-App das Aufnehmen von Fotos im Prorate-Modus nicht unterstützt.

1
JafarKhQ
Matrix matrix = new Matrix();

ExifInterface exifReader = new ExifInterface(filePath);

int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);

if (orientation ==ExifInterface.ORIENTATION_NORMAL) {

      // Do nothing. The original image is fine.

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {

       matrix.postRotate(90);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {

       matrix.postRotate(180);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {

      matrix.postRotate(270);

}
1
Anh Duy

Sie müssen das Galerieobjekt zuerst mit Contentresolver erstellen und dann den erstellten URI an die Bilderfassungsabsicht übergeben. Dann können Sie sich die Exif-Daten anschauen, NICHT die Galerie-Orientierungsdaten. 

1
Eric Novins

Das sieht wie das gleiche Problem aus, das in dieser Frage gelöst wurde: Android: Aus Galerie geladene Bitmaps werden in ImageView gedreht

0
Loktar

Ich habe das schon für ein Projekt gemacht, weil ich das gleiche Problem hatte (Android glaubt, dass Sie nur ein Landschaftsbild machen). Was ich tat, war zu diesem Zeitpunkt die Ausrichtung des Telefons zu erkennen und dann das Bild zu drehen. Es wird jedoch davon ausgegangen, dass die Orientierung immer noch gleich ist, wenn die Absicht empfangen wird.

0
Valentin Rocher

Verwenden Sie es so!

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

Und im Code,

Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);

Einfach!

0
nithinreddy

Was ich mache: Überprüfen Sie zunächst die Ausrichtung des von der Kamera aufgenommenen Bildes anhand seiner Metadaten, und wenn wir dies im Hochformat gefunden haben, müssen Sie das Bild um 90 drehen und ansonsten nur die Anzeige anzeigen.

Um Informationen über die Ausrichtung des Bildes zu erhalten, können wir die Exif-Schnittstelle verwenden.

0
g4gaj

Die einfachen exiftodegree-Antworten funktionieren nur dann konsequent, wenn Sie ein Foto aufgenommen haben, und ich verwende es dafür. Wenn Sie Probleme mit der Auswahl eines Fotos und der richtigen Ausrichtung haben, lesen Sie meine Antwort hier: Bildorientierung - Android

0
A.Sanchez.SD