Xamarin.Android
So korrigieren Sie die Ausrichtung eines mit einem Android-Gerät aufgenommenen Bildes
Suche…
Bemerkungen
- Dieses App-Beispiel ist auf meinem GitHub verfügbar:
- Die Dokumentation zu Xamarin Mobile-Komponenten ist unten verfügbar:
So korrigieren Sie die Ausrichtung eines mit einem Android-Gerät aufgenommenen Bildes
Dieses Beispiel zeigt, wie ein Bild aufgenommen und auf dem Android-Gerät korrekt angezeigt wird.
Zunächst müssen wir eine Beispielanwendung mit einer Schaltfläche und einer Bildansicht erstellen. Sobald der Benutzer auf die Schaltfläche klickt, wird die Kamera gestartet, und nachdem der Benutzer das Bild ausgewählt hat, wird diese mit der richtigen Ausrichtung auf dem Bildschirm angezeigt.
- Fügen Sie die Schaltfläche "TakePictureButton" und die Bildansicht "TakenPictureImageView" hinzu:
- Öffnen Sie jetzt den Aktivitätscode hinter:
Hier erhalten Sie zunächst einen Hinweis auf Ihre Steuerelemente:
ImageView _takenPictureImageView;
Button _takePictureButton;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
_takenPictureImageView = FindViewById<ImageView>(Resource.Id.TakenPictureImageView);
_takePictureButton = FindViewById<Button>(Resource.Id.TakePictureButton);
_takePictureButton.Click += delegate
{
takePicture();
};
}
- In unserer Anwendung verwenden wir die im Components Store verfügbare Xamarin Mobile-Komponente:
Sobald Sie es dem Projekt hinzufügen, können wir fortfahren. Fügen Sie unten den Code hinzu, der für das Starten der Kamera verantwortlich ist. Diese Methode sollte beim Klicken auf die Schaltfläche aufgerufen werden, wie Sie im obigen Code sehen können:
void takePicture() { var picker = new MediaPicker(this); DateTime now = DateTime.Now; var intent = picker.GetTakePhotoUI(new StoreCameraMediaOptions { Name = "picture_" + now.Day + "_" + now.Month + "_" + now.Year + ".jpg", Directory = null }); StartActivityForResult(intent, 1); }
Sobald der Benutzer ein Foto aufgenommen hat, sollte er in der richtigen Ausrichtung angezeigt werden. Verwenden Sie dazu die Methode unten. Es ist dafür verantwortlich, Exif-Informationen aus dem aufgenommenen Bild abzurufen (einschließlich der Ausrichtung während der Aufnahme), und dann eine Bitmap mit der richtigen Ausrichtung zu erstellen:
Bitmap loadAndResizeBitmap(string filePath) { BitmapFactory.Options options = new BitmapFactory.Options { InJustDecodeBounds = true }; BitmapFactory.DecodeFile(filePath, options); int REQUIRED_SIZE = 100; int width_tmp = options.OutWidth, height_tmp = options.OutHeight; int scale = 4; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale++; } options.InSampleSize = scale; options.InJustDecodeBounds = false; Bitmap resizedBitmap = BitmapFactory.DecodeFile(filePath, options); ExifInterface exif = null; try { exif = new ExifInterface(filePath); string orientation = exif.GetAttribute(ExifInterface.TagOrientation); Matrix matrix = new Matrix(); switch (orientation) { case "1": // landscape break; case "3": matrix.PreRotate(180); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; case "4": matrix.PreRotate(180); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; case "5": matrix.PreRotate(90); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; case "6": // portrait matrix.PreRotate(90); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; case "7": matrix.PreRotate(-90); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; case "8": matrix.PreRotate(-90); resizedBitmap = Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false); matrix.Dispose(); matrix = null; break; } return resizedBitmap; } catch (IOException ex) { Console.WriteLine("An exception was thrown when reading exif from media file...:" + ex.Message); return null; } }
Die obige Methode sollte in der OnActivityResult-Methode aufgerufen werden, nachdem der Benutzer das Bild aufgenommen hat:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == Result.Ok) { data.GetMediaFileExtraAsync(this).ContinueWith(t => { using (Bitmap bmp = loadAndResizeBitmap(t.Result.Path)) { if (bmp != null) _takenPictureImageView.SetImageBitmap(bmp); } }, TaskScheduler.FromCurrentSynchronizationContext()); } } }
Starte die Anwendung. Machen Sie ein Foto und sehen Sie das Ergebnis:
Das ist es. Jetzt werden alle Fotos in der richtigen Ausrichtung angezeigt.