Android EXIF ​​Daten immer 0, wie man es ändert?

Ich habe eine App, die Fotos mit der nativen Camera aufnimmt und sie dann auf einen Server hochlädt. Mein Problem ist, dass alle Fotos einen EXIF-Orientierungswert von 0 haben, und das verwirrt das Display an anderer Stelle.

Wie kann ich die EXIF-Orientierung ändern? Ich bin nicht auf der Suche nach einem Weg, um es für jeden Umstand zu korrigieren, ändern Sie es einfach auf einen anderen Wert.

  • Starten Sie ein Fragment über Intent innerhalb eines Fragments
  • Android App Absturz auf Samsung Galaxy S3 (aus Speicherfehler)
  • Jquery signalr client funktioniert - aber in java kann es nicht gemacht werden, um zu arbeiten
  • Android: onBackPressed () wird nicht aufgerufen, wenn die Navigationsschublade geöffnet ist
  • Fehler bei set android: installLocation = "preferExternal"
  • Android bekommt Bildschirmgröße in XML
  • Ich benutze eine Samsung Galaxy Note 4

    Ich habe diese Lösung ausprobiert, die die Kamera-Orientierung vor dem Fotografieren setzt: Einstellen von Android Photo EXIF ​​Orientierung

     Camera c = Camera.open(); c.setDisplayOrientation(90); Camera.Parameters params = mCamera.getParameters(); params.setRotation(0); // tried 0, 90, 180 c.setParameters(params); 

    Aber es beeinflusst nicht die resultierenden EXIF-Daten, es ist immer noch 0

    Ich habe auch versucht diese Lösungen, wo das Bild gedreht wird, nachdem es genommen wird: EXIF Orientierung Tag Wert immer 0 für Bild mit Porträt Kamera App Android aufgenommen

    Und während dies das Foto dreht, ist die EXIF-Orientierung immer noch 0.

    Ich habe auch versucht, die EXIF-Daten direkt einzustellen: So speichern Sie Exif-Daten nach der Bitmap-Komprimierung in Android

     private Camera.PictureCallback mPicture = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { final File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE, ""); try { FileOutputStream fos = new FileOutputStream(pictureFile); ExifInterface exif = new ExifInterface(pictureFile.toString()); exif.setAttribute(ExifInterface.TAG_ORIENTATION, "3"); exif.saveAttributes(); fos.write(data); fos.close(); //upload photo.. } } } 

    Aber EXIF ​​Orientierung ist nach dem Hochladen noch 0.

    Ich habe auch diese Lösungen angesehen:

    Exif Daten TAG_ORIENTATION immer 0

    Wie schreibe ich exif Daten ins Bild in Android?

    So erhalten Sie die korrekte Ausrichtung des Bildes, das aus der Galerie "Standardbild" ausgewählt wurde

    Wie kann man die Kamera einstellen Bildorientierung?

    Aber sie alle beinhalten die Korrektur der Orientierung durch Drehen, die die EXIF-Daten nicht beeinflusst oder die EXIF-Daten direkt festlegt, was nicht zu funktionieren scheint.

    Wie kann ich die EXIF-Orientierungsdaten der Datei von 0 auf 3 ändern?

    AKTUALISIEREN:

    Hier ist mein Upload-Code:

     Bitmap sBitmap = null; final File sResizedFile = getOutputMediaFile(MEDIA_TYPE_IMAGE, "_2"); try { sBitmap = BitmapFactory.decodeStream(new FileInputStream(pictureFile), null, options); } catch (FileNotFoundException e) { Log.e("App", "[MainActivity] unable to convert pictureFile to bitmap"); e.printStackTrace(); return; } // ... compute sw and sh int values Bitmap sOut = Bitmap.createScaledBitmap(sBitmap, sw, sh, false); Bitmap rotatedBitmap = rotateBitmap(sOut, 3); FileOutputStream sfOut; try { sfOut = new FileOutputStream(sResizedFile); rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, sfOut); sfOut.flush(); sfOut.close(); sBitmap.recycle(); sOut.recycle(); rotatedBitmap.recycle(); } catch (Exception e) { Log.e("App", "[MainActivity] unable to save thumbnail"); e.printStackTrace(); return; } // upload small thumbnail TransferObserver sObserver = transferUtility.upload( "stills/small", /* The bucket to upload to */ filename + ".jpg", /* The key for the uploaded object */ sResizedFile /* The file where the data to upload exists */ ); 

  • Android Studio bauen Aromen - Wie man gleiche Quelldateien in verschiedenen Geschmacksrichtungen hat
  • OnActivityResult-Methode wird nicht als Android bezeichnet
  • Kann nicht auf externe Speicherung schreiben, es sei denn, die App wird nach Erteilung der Genehmigung neu gestartet
  • Wie man den Marker in der Android Map api V2 animiert?
  • Wissen, wann eine Ansicht in einem ListView aus dem Bildschirm gegangen ist?
  • JQuery mobile Aktivitätsanzeige zeigt nicht in Android
  • 5 Solutions collect form web for “Android EXIF ​​Daten immer 0, wie man es ändert?”

    Wie Sie sehen können, ist die EXIF-Information auf Android nicht zuverlässig (vor allem Samsung-Geräte).

    Allerdings ist die Telefon-SQL-Datenbank mit den Verweisen auf Media-Objekt zuverlässig. Ich würde vorschlagen, diesen Weg zu gehen.

    Die Orientierung aus dem Uri:

     private static int getOrientation(Context context, Uri photoUri) { Cursor cursor = context.getContentResolver().query(photoUri, new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null); if (cursor.getCount() != 1) { cursor.close(); return -1; } cursor.moveToFirst(); int orientation = cursor.getInt(0); cursor.close(); cursor = null; return orientation; } 

    Dann initialisiert gedrehte Bitmap :

     public static Bitmap rotateBitmap(Context context, Uri photoUri, Bitmap bitmap) { int orientation = getOrientation(context, photoUri); if (orientation <= 0) { return bitmap; } Matrix matrix = new Matrix(); matrix.postRotate(orientation); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); return bitmap; } 

    Wenn Sie die Ausrichtung des Bildes ändern möchten, versuchen Sie es mit folgendem Snippet:

     public static boolean setOrientation(Context context, Uri fileUri, int orientation) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.ORIENTATION, orientation); int rowsUpdated = context.getContentResolver().update(fileUri, values, null, null); return rowsUpdated > 0; } 

    Wenn Sie die Ausrichtung des Bildes einstellen, wird es später ständig auf die richtige Ausrichtung gesetzt. Es besteht die Notwendigkeit, ExifInterface später zu nutzen, da das Bild bereits in richtiger Weise gedreht wird.

    Wenn diese Methode nicht zufrieden stellend ist, dann könntest du diese Methode ausprobieren

    Du hast deine eigene Antwort als Lösung akzeptiert. Mein Rant ist nur nützliche Side-Info, jedenfalls …

    Das "Allerdings …" in deiner Antwort schlägt vor, während du jetzt die Ursache kennst, du hast keine Fixierung.

    Stellt sich heraus, mein Code war in der Lage, die EXIF-Daten, aber es gibt eine Diskrepanz zwischen, wie Android interpretiert diese Daten und wie iOS … interpretiert es.

    Dies könnte ein endianness Problem sein. Sie können versuchen, manuell ändern die endianness Einstellung von Exif durch Öffnen Ihres Jpegs in einem Hex-Editor und finden …

    • Die Bytes 45 78 69 66 (macht "Exif" Text) gefolgt von zwei Null Bytes 00 00 .
    • Dann sollte es 49 49 (macht "II" Text), was bedeutet, Daten als kleines endianes Format zu lesen.
    • Wenn Sie es mit 4D 4D (oder "MM" Text) ersetzen, dann wird die Leseseite Daten als Big Endian betrachten.

    Testen Sie dies in iOS, um zu sehen, ob die Zahlen jetzt korrekt sind.

    Und in Bezug auf diese …

    Allerdings stellt die Einstellung 3 als 0 auf iOS auf und das Bild ist seitlich in Chrome.
    Einstellung 6 zeigt sich als 3 auf iOS und das Bild sieht richtig in Chrome.

    Nur was ich hinzufügen kann ist, dass iOS Mac Big Endian ist * und Android / PC ist Little Endian . Im Wesentlichen liest Little Endian Bytes als rechts-nach-links, während Big Endian gegenüber ist.

    In binär: 011 bedeutet 3 und 110 bedeutet 6 . Der Unterschied zwischen 3 und 6 ist einfach die Lesereihenfolge dieser Bits von Einsen & Nullen. Also ein System, das als zero-one-one liest, bekommt ein Ergebnis von 3, aber das andere Endian-System liest ein Byte mit den gleichen Bits wie one-one-zero und sagt dir Ergebnis ist ein 6 . Ich kann nicht erklären, warum "3 erscheint als 0" ohne eine Testdatei, um Bytes zu analysieren, aber es ist ein seltsames Ergebnis für mich.

    </end rant>
    <sleep>

    * Anmerkung : Während Macs Big Endian sind, sagt Double-Checking, dass iOS das Little Endian System einsetzt. Ihre Zahlen schlagen immer noch eine Big vs Little Endian Problem aber.

    Stellt sich heraus, dass mein Code in der Lage war, die EXIF-Daten einzustellen, aber es gibt eine Diskrepanz zwischen, wie Android diese Daten interpretiert und wie iOS und Chrome auf einem Mac (wo ich die resultierende Datei überprüft habe) interpretiert es.

    Dies ist der einzige Code, der benötigt wird, um die EXIF-Orientierung zu setzen:

     ExifInterface exif = new ExifInterface(pictureFile.toString()); exif.setAttribute(ExifInterface.TAG_ORIENTATION, "3"); exif.saveAttributes(); 

    Allerdings stellt die Einstellung 3 als 0 auf iOS auf und das Bild ist seitlich in Chrome.

    Einstellung 6 zeigt sich als 3 auf iOS und das Bild sieht richtig in Chrome.

    Verweise dieses GitHub-Projekt https://github.com/pandiaraj44/Camera . Es hat die benutzerdefinierte Kamera-Aktivität, wo EXIF ​​TAG_ORIENTATION korrekt behandelt wurde. Sie können das Projekt klonen und überprüfen. Für Code-Details siehe https://github.com/pandiaraj44/Camera/blob/master/app/src/main/java/com/pansapp/cameraview/CameraFragment.java

    Es gibt eine Klasse, um diese Informationen zu lesen und zu aktualisieren.

    Um die Attribute zu aktualisieren, können Sie so verwenden

     ExifInterface ef = new ExifInterface(filePath); ef.setAttribute(MAKE_TAG, MAKE_TAG); ef.setAttribute(ExifInterface.TAG_ORIENTATION, orientation+""); ef.saveAttributes(); 

    Und zum Lesen können Sie so verwenden

      ExifInterface exif = null; try { exif = new ExifInterface(absolutePath+path); } catch (IOException e) { e.printStackTrace(); } int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

    ich hoffe es hilft dir

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.