Ich nehme ein Bild auf und setze es auf Bildansicht.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// imageView.setImageBitmap(bitmap);
imageView.setImageURI(imageUri);
}
else {
}
}
public Bitmap getBitmapFromUri() {
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
return bitmap;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
Das Problem ist jedoch, dass das Bild auf einigen Geräten jedes Mal gedreht wird, wenn es gedreht wird. Auf einem Samsung-Gerät funktioniert es beispielsweise gut, auf einem Sony Xperia wird das Bild jedoch um 90 Grad und auf dem Toshiba Thrive (Tablet) um 180 Grad gedreht.
Antworten:
Die meisten Telefonkameras sind im Querformat. Wenn Sie das Foto im Hochformat aufnehmen, werden die resultierenden Fotos um 90 Grad gedreht. In diesem Fall sollte die Kamerasoftware die Exif- Daten mit der Ausrichtung füllen, in der das Foto angezeigt werden soll.
Beachten Sie, dass die folgende Lösung von der Kamera-Software / dem Gerätehersteller abhängt, die bzw. der die Exif-Daten ausfüllt. Daher funktioniert sie in den meisten Fällen, ist jedoch keine 100% zuverlässige Lösung.
Hier ist die
rotateImage
Methode:quelle
exif.getAttributeInt
VerwendungsoptionExifInterface.ORIENTATION_UNDEFINED
ist nahezu identisch, da der zweite Parameter der Standardwert ist, falls die Funktion den Wert nicht bereitstellt.Durch die Kombination von Jason Robinson ‚s Antwort mit Felix ‘ s Antwort und füllt die fehlenden Teile, hier ist die letzte vollständige Lösung für dieses Problem , das die folgenden nach der Prüfung auf Android tun Android 4.1 ( Jelly Bean ), Android 4.4 ( KitKat ) und Android 5.0 ( Lollipop ).
Schritte
Verkleinern Sie das Bild, wenn es größer als 1024 x 1024 ist.
Drehen Sie das Bild nur dann in die richtige Ausrichtung , wenn es um 90, 180 oder 270 Grad gedreht wurde.
Recyceln Sie das gedrehte Bild für Speicherzwecke.
Hier ist der Codeteil:
Rufen Sie die folgende Methode mit dem aktuellen
Context
und dem Bild aufURI
, das Sie reparieren möchtenHier ist die
CalculateInSampleSize
Methode aus der oben genannten Quelle :Dann kommt die Methode, die die aktuelle Bildausrichtung überprüft, um den Drehwinkel zu bestimmen
Schließlich die Rotationsmethode selbst
- Vergessen Sie nicht, für die Antworten der Jungs für ihre Bemühungen und Shirish Herwade zu stimmen , die diese hilfreiche Frage gestellt haben.
quelle
Es ist einfach, die Bildausrichtung zu erkennen und die Bitmap zu ersetzen, indem Sie:
Um zu vermeiden, dass bei großen Bildern keine Erinnerungen mehr vorhanden sind, würde ich Ihnen empfehlen, das Bild mit folgenden Elementen neu zu skalieren:
Es ist nicht möglich, ExifInterface zu verwenden, um die Orientierung zu erhalten, da ein Problem mit dem Android-Betriebssystem vorliegt: https://code.google.com/p/android/issues/detail?id=19268
Und hier ist
calculateInSampleSize
quelle
Einzeilige Lösung:
Oder
Dadurch wird die Drehung automatisch erkannt und das Bild in die richtige Ausrichtung gebracht
Picasso ist eine sehr leistungsstarke Bibliothek für die Verarbeitung von Bildern in Ihrer App. Dazu gehören: Komplexe Bildtransformationen mit minimalem Speicherbedarf.
quelle
Ich habe viel Zeit damit verbracht, nach einer Lösung dafür zu suchen. Und das endlich geschafft. Vergiss nicht, die Antwort von @Jason Robinson zu verbessern, da meine auf seiner basiert.
Als erstes sollten Sie wissen, dass wir seit Android 7.0 verwenden müssen
FileProvider
und etwas namensContentUri
, sonst erhalten Sie einen nervigen Fehler beim Versuch, Ihre aufzurufenIntent
. Dies ist ein Beispielcode:Methodenbasis
getUriFromPath(Context, String)
auf User-Version von Android erstellenFileUri (file://...)
oderContentUri (content://...)
und da ist es:Nachdem
onActivityResult
Sie festgestellt haben,uri
wo das Bild von der Kamera gespeichert wurde, aber jetzt die Kameradrehung erkennen müssen, verwenden wir hier die modifizierte @ Jason Robinson-Antwort:Zuerst müssen wir
ExifInterface
basierend auf erstellenUri
Der obige Code kann vereinfacht werden, aber ich möchte alles zeigen. Also
FileUri
können wirExifInterface
basierend auf erstellenString path
, aber von könnenContentUri
wir nicht, Android unterstützt das nicht.In diesem Fall müssen wir einen anderen Konstruktor verwenden, der auf basiert
InputStream
. Denken Sie daran, dass dieser Konstruktor standardmäßig nicht verfügbar ist. Sie müssen eine zusätzliche Bibliothek hinzufügen:Jetzt können wir die
getExifInterface
Methode verwenden, um unseren Winkel zu ermitteln:Jetzt haben Sie den Winkel, um Ihr Bild richtig zu drehen :).
quelle
activity_main.xml
MainActivity.java
quelle
Sie können einfach die Ausrichtung des Kamerasensors lesen, wie von Google in der Dokumentation angegeben: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html
Beispielcode:
quelle
Jason Robinson Antwort und Sami Eltamawy Antwort ist ausgezeichnet.
Nur eine Verbesserung, um den Ansatz zu vervollständigen, sollten Sie kompatibles ExifInterface verwenden.
com.android.support:exifinterface:${lastLibVersion}
Sie können das ExifInterface (pior API <24) mit
InputStream
(fromContentResolver
) anstelle von uri-Pfaden instanziieren, wobei "Ausnahmen für Datei nicht gefunden" vermieden werden.https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
quelle
Normalerweise wird empfohlen, das Problem mit dem ExifInterface zu lösen , wie es @Jason Robinson vorgeschlagen hat. Wenn dieser Ansatz nicht funktioniert, können Sie versuchen, die Ausrichtung des zuletzt aufgenommenen Bildes nachzuschlagen ...
quelle
Leider hat die Antwort von @ jason-robinson oben bei mir nicht funktioniert.
Obwohl die Drehfunktion perfekt funktioniert:
Ich musste Folgendes tun, um die Ausrichtung zu erhalten, da die Exif-Ausrichtung immer 0 war
quelle
Versuchen Sie besser, das Bild in einer bestimmten Ausrichtung aufzunehmen.
Für beste Ergebnisse geben Sie die Querformatorientierung in der Kameraansicht an.
quelle
Wenn jemand Erfahrungen Probleme mit
ExifInterface
auf Android 4.4 (KitKat) für die Ausrichtung bekommen, könnte es wegen falsch seinem Weg von der URI bekam. Eine Lösung für Propoer finden SiegetPath
in der Frage zum Stapelüberlauf. Erhalten Sie einen echten Pfad von URI, dem neuen Speicherzugriffs-Framework von Android KitKatquelle
Finden Sie unten Link diese Lösung ist die beste https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/
quelle
Die ausgewählte Antwort verwendet die häufigste Methode, die auf diese und ähnliche Fragen beantwortet wird. Es funktioniert jedoch nicht mit Vorder- und Rückkameras von Samsung. Für diejenigen, die nach einer Lösung suchen, die sowohl für Vorder- als auch für Rückkameras von Samsung und anderen großen Herstellern funktioniert, ist diese Antwort von nvhausid fantastisch:
https://stackoverflow.com/a/18915443/6080472
Für diejenigen, die sich nicht durchklicken möchten, ist die relevante Magie, die CameraInfo zu verwenden, anstatt sich auf EXIF zu verlassen.
Vollständiger Code im Link.
quelle
Dies ist vielleicht selbstverständlich, aber denken Sie immer daran, dass Sie einige dieser Probleme bei der Bildbearbeitung auf Ihrem Server lösen können. Ich habe Antworten wie die in diesem Thread enthaltenen verwendet, um die sofortige Anzeige des Bildes zu ermöglichen. Für meine Anwendung müssen jedoch Bilder auf dem Server gespeichert werden (dies ist wahrscheinlich eine häufige Anforderung, wenn das Bild erhalten bleiben soll, wenn Benutzer das Telefon wechseln).
Die in vielen Threads zu diesem Thema enthaltenen Lösungen behandeln nicht die mangelnde Persistenz der EXIF-Daten, die die Bildkomprimierung der Bitmap nicht überlebt. Dies bedeutet, dass Sie das Bild jedes Mal drehen müssen, wenn Ihr Server es lädt. Alternativ können Sie die EXIF-Orientierungsdaten an Ihren Server senden und das Bild dort bei Bedarf drehen.
Es war einfacher für mich, eine dauerhafte Lösung auf einem Server zu erstellen, da ich mich nicht um die geheimen Dateipfade von Android kümmern musste.
quelle
Die einfachste Lösung für dieses Problem:
Ich speichere das Bild im JPG-Format.
quelle
Hier ist
Xamarin.Android
Version:Aus der Antwort von @Jason Robinson :
Dann
calculateInSampleSize
Methode:Aus der Antwort von @Sami Eltamawy :
quelle
Wenn Sie Fresco verwenden, können Sie dies verwenden -
Dadurch werden die Bilder automatisch basierend auf Exif-Daten gedreht.
Quelle: https://frescolib.org/docs/rotation.html
quelle
Der folgende Code hat bei mir funktioniert, er hat die Bitmap aus der DateiUri erhalten und bei Bedarf die Rotationskorrektur durchgeführt:
quelle
Ich habe eine Antwort auf dieses Problem erhalten, ohne ExifInterface zu verwenden . Wir können die Drehung der Kamera entweder auf der Vorder- oder auf der Rückkamera abrufen, je nachdem, was Sie verwenden. Während der Erstellung der Bitmap können wir die Bitmap mit Matrix.postRotate (Grad) drehen.
Nach der Berechnung der Drehung können Sie Ihre Bitmap wie folgt drehen:
Herare bm sollte Ihre Bitmap sein.
Wenn Sie die Drehung Ihrer Frontkamera wissen möchten, ändern Sie oben einfach Camera.CameraInfo.CAMERA_FACING_BACK in Camera.CameraInfo.CAMERA_FACING_FRONT .
Ich hoffe das hilft.
quelle
Ich habe eine Kotlin-Erweiterungsfunktion erstellt, die den Betrieb für Kotlin-Entwickler basierend auf der Antwort von @Jason Robinson vereinfacht. Ich hoffe, es hilft.
quelle
Es gibt einen einfacheren Befehl, um diesen Fehler zu beheben.
Fügen Sie einfach nach yourImageView.setBitmap (Bitmap) hinzu. this yourImageView.setRotation (90);
Diese feste Mine. Ich hoffe es hilft !
quelle
das hat bei mir funktioniert
quelle