Wenn ich ein Bild aus der Mediengalerie in eine Bitmap lade, funktioniert alles einwandfrei, außer dass Bilder, die mit der Kamera aufgenommen wurden, während das Telefon vertikal gehalten wurde, so gedreht werden, dass ich immer ein horizontales Bild erhalte, obwohl es vertikal in der angezeigt wird Galerie. Warum ist das so und wie kann ich es richtig laden?
138
Antworten:
Haben Sie sich die EXIF-Daten der Bilder angesehen? Möglicherweise kennt es die Ausrichtung der Kamera, als das Bild aufgenommen wurde.
quelle
Also als Beispiel ...
Zuerst müssen Sie ein ExifInterface erstellen:
Sie können dann die Ausrichtung des Bildes erfassen:
Die Orientierungswerte bedeuten Folgendes : http://sylvana.net/jpegcrop/exif_orientation.html
Die wichtigsten Werte sind also 3, 6 und 8. Wenn die Ausrichtung beispielsweise
ExifInterface.ORIENTATION_ROTATE_90
(6) ist, können Sie das Bild wie folgt drehen:Das ist jedoch nur ein kurzes Beispiel. Ich bin sicher, es gibt andere Möglichkeiten, die eigentliche Rotation durchzuführen. Aber Sie finden diese auch auf StackOverflow.
quelle
OutOfMemoryError
wann Sie diesen Ansatz verwenden, da Sie zwei Bitmaps gleichzeitig im Speicher halten.Dies ist eine vollständige Lösung (im Hackbook-Beispiel des Facebook SDK enthalten). Es hat den Vorteil, dass kein Zugriff auf die Datei selbst erforderlich ist. Dies ist äußerst nützlich, wenn Sie ein Bild vom Content Resolver-Ding laden (z. B. wenn Ihre App auf eine Absicht zum Teilen von Fotos reagiert).
Und dann können Sie eine gedrehte Bitmap wie folgt erhalten. Dieser Code verkleinert das Bild (leider) auf MAX_IMAGE_DIMENSION. Andernfalls kann der Speicherplatz knapp werden.
quelle
ExifInterface exif = new ExifInterface(photoUri.getPath());
und dannexif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1)
Orientierung zu erhalten (zBORIENTATION_ROTATE_90
,ORIENTATION_ROTATE_180
)In meinem Fall wurde es mit diesem Code mithilfe dieses Beitrags gelöst:
Hoffe, es spart jemandem Zeit!
quelle
Verwenden Sie ein Dienstprogramm, um das schwere Heben durchzuführen.
9re hat ein einfaches Dienstprogramm entwickelt, um das schwere Aufheben des Umgangs mit EXIF-Daten und das Drehen von Bildern in die richtige Ausrichtung zu bewältigen.
Den Dienstprogrammcode finden Sie hier: https://gist.github.com/9re/1990019
Laden Sie dies einfach herunter, fügen Sie es dem
src
Verzeichnis Ihres Projekts hinzu und verwenden Sie esExifUtil.rotateBitmap()
, um die richtige Ausrichtung zu erhalten, wie folgt:quelle
Es liegt daran, dass die Galerie korrekt gedrehte Bilder anzeigt, aber nicht ImageView.
und du brauchst das:
quelle
Habe es nach vielen Versuchen dank eines Beitrags zum Laufen gebracht, den ich nicht mehr finden kann :-(
Exif scheint immer zu funktionieren, die Schwierigkeit bestand darin, den Dateipfad zu erhalten. Der Code, den ich gefunden habe, unterscheidet zwischen API älter als 4.4 und nach 4.4. Grundsätzlich enthält der Bild-URI für 4.4+ "com.android.providers". Für diesen URI-Typ verwendet der Code DocumentsContract, um die Bild-ID abzurufen, und führt dann eine Abfrage mit dem ContentResolver aus, während der Code für ältere SDKs direkt den URI mit dem ContentResolver abfragt.
Hier ist der Code (leider kann ich nicht gutschreiben, wer ihn gepostet hat):
quelle
Sie können einfach den Pfad von der SD-Karte lesen und den folgenden Code ausführen ... das vorhandene Foto wird nach dem Drehen ersetzt.
Nicht: Exif funktioniert auf den meisten Geräten nicht, es gibt die falschen Daten aus, daher ist es gut, die Drehung vor dem Speichern in einem beliebigen Grad hart zu codieren. Sie müssen nur den Winkelwert in postRotate in einen beliebigen Wert ändern.
quelle
Kotlin-Code:
quelle
Ich habe die Antwort von Teo Inke verbessert. Das Bild wird nicht mehr gedreht, es sei denn, dies ist tatsächlich erforderlich. Es ist auch einfacher zu lesen und sollte schneller laufen.
quelle
Das erste, was Sie brauchen, ist der echte Dateipfad. Wenn Sie es gut haben und URI verwenden, verwenden Sie diese Methode, um den echten Pfad zu erhalten:
Extrahieren Sie Ihre Bitmap zum Beispiel:
Sie können stattdessen decodeFile () verwenden, wenn Sie möchten.
Nachdem Sie die Bitmap und den realen Pfad haben, erhalten Sie die Ausrichtung des Bildes:
und schließlich drehen Sie es wie folgt in die richtige Position:
Jetzt haben Sie die Bitmap in die richtige Position gedreht.
Prost.
quelle
Dies funktioniert, ist aber wahrscheinlich nicht der beste Weg, aber es könnte jemandem helfen.
quelle
Vielleicht hilft das (um 90 Grad drehen) (das hat bei mir funktioniert)
quelle
Der Cursor sollte nach dem Öffnen geschlossen werden.
Hier ist ein Beispiel.
quelle
Ich habe @Timmmm Antwort und @Manuel geschmolzen. Wenn Sie diese Lösung ausführen, wird keine Ausnahme für "Nicht genügend Speicher" angezeigt.
Diese Methode ruft die Bildausrichtung ab:
Daher würden Sie diese Methode verwenden, um die Größe des Bilds zu ändern, bevor Sie es in den Speicher laden. Auf diese Weise erhalten Sie keine Speicherausnahme.
Das funktioniert perfekt für mich. Ich hoffe das hilft jemand anderem
quelle
Verbesserung der obigen Lösung durch Timmmm, um am Ende eine zusätzliche Skalierung hinzuzufügen, um sicherzustellen, dass das Bild innerhalb der Grenzen passt:
quelle
Verwenden Sie den folgenden Code, um ein Bild richtig zu drehen:
quelle
Die folgenden Methoden skalieren UND drehen die Bitmap entsprechend der Ausrichtung:
Beispiel:
quelle
Ich habe das Problem mit der folgenden Problemumgehung gelöst. Beachten Sie, dass ich auch das Bild skaliere, was erforderlich war, um OutOfMemoryExceptions zu vermeiden.
Beachten Sie, dass diese Lösung mit Porträtbildern oder verkehrten Bildern nicht ordnungsgemäß funktioniert (danke Timmmm für die Notiz). Die obige Lösung von Timmmm ist möglicherweise die bessere Wahl, wenn dies erforderlich ist, und sie sieht auch eleganter aus: https://stackoverflow.com/a/8914291/449918
Prost
quelle