Xamarin.Android
Hoe de oriëntatie van een foto gemaakt vanaf een Android-apparaat te corrigeren
Zoeken…
Opmerkingen
- Dit app-voorbeeld is hieronder beschikbaar op mijn GitHub:
- Xamarin Mobile component documentatie is hieronder beschikbaar:
Hoe de oriëntatie van een foto gemaakt vanaf een Android-apparaat te corrigeren
Dit voorbeeld laat zien hoe u een foto kunt maken en deze correct kunt weergeven op het Android-apparaat.
Eerst moeten we een voorbeeldtoepassing maken met één knop en één beeldweergave. Zodra de gebruiker op de knop klikt, wordt de camera gestart en nadat de gebruiker de foto heeft geselecteerd, wordt deze met de juiste oriëntatie op het scherm weergegeven.
- Knop met de naam "TakePictureButton" en beeldweergave met de naam "TakenPictureImageView" toevoegen:
- Open nu de activiteitscode achter:
Hier krijgt u eerst een verwijzing naar uw bedieningselementen:
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 onze applicatie zullen we de Xamarin Mobile-component gebruiken die beschikbaar is in de Components Store:
Nadat u het aan het project hebt toegevoegd, kunnen we verder gaan. Voeg onderstaande code toe die verantwoordelijk is voor het starten van de camera. Deze methode moet worden opgeroepen met de knopklik, zoals u kunt zien in de bovenstaande code:
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); }
Zodra de gebruiker een foto maakt, moeten we deze in de juiste richting weergeven. Gebruik de onderstaande methode om dit te doen. Het is verantwoordelijk voor het ophalen van exif-informatie uit de genomen afbeelding (inclusief oriëntatie tijdens het moment van nemen van foto) en dan het maken van een bitmap met de juiste oriëntatie:
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; } }
De bovenstaande methode moet worden aangeroepen in de methode OnActivityResult die wordt opgeroepen nadat de gebruiker de foto heeft genomen:
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()); } } }
Start de applicatie. Maak een foto en bekijk het resultaat:
Dat is het. Nu wordt alles wat u hebt genomen in de juiste richting weergegeven.