2017-01-24 6 views
1

In Android habe ich festgestellt, dass wenn ich ein Bild mit der Kamera mache und es einem ImageView zugebe, auf einigen Kameras (wie meinem Handy) um 90 Grad gedreht ist (während auf den Emulator-Telefonen, die ich benutze, t gedreht).Richtiger Weg, um Android-Bilder zu drehen?

Ich versuchte dies:

//once you have the main bitmap 
    ExifInterface ei = null; 
    try { 
     ei = new ExifInterface(imageFilepath); 
     int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 
     bitmap = getRotatedBitmap(bitmap, orientation); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    }   

Jetzt den Dreh Code:

public static Bitmap getRotatedBitmap(Bitmap bitmap, int orientation) { 
    Matrix matrix = new Matrix(); 
    switch (orientation) { 
     case ExifInterface.ORIENTATION_NORMAL: 
      return bitmap; 
     case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: 
      matrix.setScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      matrix.setRotate(180); 
      break; 
     case ExifInterface.ORIENTATION_FLIP_VERTICAL: 
      matrix.setRotate(180); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_TRANSPOSE: 
      matrix.setRotate(90); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      matrix.setRotate(90); 
      break; 
     case ExifInterface.ORIENTATION_TRANSVERSE: 
      matrix.setRotate(-90); 
      matrix.postScale(-1, 1); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      matrix.setRotate(-90); 
      break; 
     default: 
      return bitmap; 
    } 
    try { 
     Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
     bitmap.recycle(); 
     return bmRotated; 
    } 
    catch (OutOfMemoryError e) { 
     return bitmap; 
    } 
} 

dies richtig ist? Oder ist es schrecklich ineffizient? Gibt es dafür einen klügeren Weg? Wenn ich den Rotationscode auf eine Bitmap anwende und sie dann wieder im Speicher abspeichere, wird sie jetzt "falsch gedreht" oder muss ich sie zurückdrehen? Ich weiß nicht, was die akzeptierte Praxis für all das ist.

+0

Überprüfen Sie diesen Link, http://StackOverflow.com/Questions/14066038/Why-does-Animage-Captured-using-Camera-Intent-Get-Rotated-on-Some-Devices-on-A- – Shekhar

+0

@ Shekhar Es scheint so, als würde es mehr oder weniger dasselbe machen wie ich. – user7461935

+0

Ich denke, in Samsung Device wird das Bild gedreht, oder? – Shekhar

Antwort

0

Ist das korrekt?

Ich bin skeptisch, dass Sie tatsächlich alle diese Orientierungsmöglichkeiten in der Wildnis sehen werden. Wenn Sie das Bild drehen, nimmt es viel Heap-Speicher in Anspruch, also erwarten Sie manchmal, dass dieser Code mit einem OutOfMemoryError fehlschlägt.

Gibt es einen klügeren Weg, dies zu tun?

Wenn alles, was Sie wollen für das Bild richtig in den ImageView zu zeigen, drehen Sie die ImageView.

Wenn ich den Rotationscode auf ein Bitmap anwende und es dann wieder im Speicher ablege, wird es jetzt "falsch gedreht" oder muss ich es zurückdrehen?

Das ist unmöglich zu beantworten, da nur Sie wissen, wie Sie es speichern und was "falsch" in diesem Zusammenhang bedeuten würde. IMHO, wenn Sie diesen Prozess durchlaufen, drehen Sie es in den Zustand ORIENTATION_NORMAL, dann speichern Sie es entweder ohne EXIF-Header oder speichern Sie es mit ORIENTATION_NORMAL.

+0

"IMHO, wenn Sie diesen Prozess durchlaufen, drehen Sie es in den ORIENTATION_NORMAL Zustand, dann speichern Sie es entweder ohne EXIF-Header oder speichern Sie es mit ORIENTATION_NORMAL." Wie würde ich das tun? Die Bitmap drehen, über die alte Datei speichern, den EXIF ​​irgendwie ersetzen? – user7461935

+0

@ user7461935: Wenn Sie ein besseres 'ExifInterface' verwenden, können Sie sowohl Tags schreiben als auch lesen. In [dieser Beispiel-App] (https://github.com/commonsguy/cw-omnibus/blob/master/Camera/EXIFRotater/app/src/main/java/com/commonsware/android/exif/MainActivity.java), Ich demonstriere sowohl das 'ImageView' als auch (separat) das Drehen der eigentlichen Bitmap, indem ich den EXIF-Orientierungs-Header auf 1 setze. Prinzipiell könnte man andere EXIF-Header von der alten in die neue kopieren, obwohl ich vergesse, ob oder nicht ist praktisch. – CommonsWare

+0

Ich bin nicht wirklich sicher, was das alles im Zusammenhang mit meiner Frage bedeutet. Willst du damit sagen, dass ich das Quellbild nicht einfach rotieren kann (indem ich das Bitmap rotiere und dann das Bitmap als PNG speichere) und es auf ORIENTATION_NORMAL setze? – user7461935

Verwandte Themen