2012-10-04 25 views
26

Ich setze ein Bild auf die aus der Galerie ausgewählte Bildansicht (Fotoalbum). Wenn das ausgewählte Bild eine Querformatausrichtung aufweist, wird es perfekt angezeigt, aber wenn das Bild im Hochformat (d. H. Das Bild wurde im Hochformat geklickt) wurde, wird das Bild mit einer Drehung um 90 Grad angezeigt. Jetzt versuche ich die Ausrichtung herauszufinden, bevor ich die Bildansicht einstelle, aber alle Bilder geben die gleiche Ausrichtung und die gleiche Breite-Höhe. Hier ist mein Code:Android: Wie erkennt man die Bildausrichtung (Hoch- oder Querformat), die aus der Galerie ausgewählt wurde, während eine Bildansicht eingestellt wird?

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

kann mir jemand helfen, ich habe gleiche issue..http: //stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

Antwort

47

Verwenden ExifInterface für Bild drehen. Verwenden Sie diese Methode, um den korrekten Wert für das Drehen des aufgenommenen Bildes von der Kamera zu erhalten.

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

Und setzen Sie diesen Code in Folge Methode Aktivität und bekommen Wert Bild zu drehen ...

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

this helps ..

+2

exif.getAttributeInt (ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); gibt für jedes Orientierungsbild immer den Wert 0 zurück. – sarabhai05

+0

Entschuldigung, ich habe einen Fehler gemacht. Ihr Ansatz funktioniert für mich. Auch die data.getData() gibt Uri nicht String zurück, bitte schauen Sie sich Ihren Code an. – sarabhai05

+6

@Deepak Warum muss ich 'context.getContentResolver() aufrufen. NotifyChange (imageUri, null)'? –

4

Dies gilt auch für mich funktioniert:

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

können Sie den vollständigen Code hinzufügen? Danke –

+0

Welchen Teil des Codes möchten Sie? – sarabhai05

-1

Diese Arbeit für mich:

+3

Bei einigen Geräten (wie s3 und s4) ist die Breite größer als die Höhe, selbst das Bild ist im Hochformat.Deshalb verwenden wir diese Lösung nicht, auch wenn sie sauber und perfekt aussieht. –

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

Bei einigen Geräten (wie s3 und s4) ist die Breite größer als die Höhe, selbst das Bild ist im Hochformat. Deshalb verwenden wir diese Lösung nicht, auch wenn sie sauber und perfekt aussieht. –

+0

@JesusDimrix Ja, es kann ein Fall sein. Aber wenn das Bild keine Orientierungsinformation in seinem Header hat, können wir diesen Weg benutzen. – ultimate

+0

ich war verrückt, versuchen, dies zu WorkYour Weg ist gut genug für mich Galaxy s was? –

1

Hier ist eine große Lösung, die ich für diese über kam:>https://stackoverflow.com/a/34241250/8033090

Eine Linie Lösung:

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

oder

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

wird automatisch erkennen Rotation und Platz Bild in der richtigen Orientierung

Picasso ist eine sehr leistungsfähige Bibliothek für den Umgang mit Bildern in Ihrer Anwendung beinhaltet: Komplexe Bildtransformationen mit minimalem Speicherverbrauch. Es kann eine Sekunde dauern, um zu laden, aber ich lege einfach etwas Text hinter die Bildansicht, die sagt "Lade Bild" und wenn das Bild geladen wird deckt es den Text ab.