Xamarin.Android
Cómo corregir la orientación de una imagen capturada desde un dispositivo Android
Buscar..
Observaciones
- Esta muestra de aplicación está disponible en mi GitHub a continuación:
- La documentación del componente móvil de Xamarin está disponible a continuación:
Cómo corregir la orientación de una imagen capturada desde un dispositivo Android
Este ejemplo muestra cómo tomar una imagen y mostrarla correctamente en el dispositivo Android.
Primero, tenemos que crear una aplicación de ejemplo con un botón y una vista de imagen. Una vez que el usuario hace clic en el botón, la cámara se inicia y una vez que el usuario selecciona la imagen, se mostrará con la orientación correcta en la pantalla.
- Agregue el botón llamado "TakePictureButton" y la vista de imagen llamada "TakenPictureImageView":
- Ahora abre el código de actividad detrás:
Aquí en primer lugar obtener referencia a sus controles:
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();
};
}
- En nuestra aplicación, usaremos el componente de Xamarin Mobile disponible en la tienda de componentes:
Una vez que lo agregues al proyecto podemos seguir adelante. Agregue el siguiente código que es responsable de lanzar la cámara. Este método debe invocarse en el botón de clic como se puede ver en el código anterior:
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); }
Una vez que el usuario toma la foto, debemos mostrarla en la orientación correcta. Para hacerlo utiliza el siguiente método. Es responsable de recuperar la información exif de la imagen tomada (incluida la orientación durante el momento de tomar la fotografía) y de crear un mapa de bits con la orientación correcta:
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; } }
El método anterior debe invocarse en el método OnActivityResult invocado después de que el usuario tome la foto:
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()); } } }
Iniciar la aplicacion. Tome una foto y vea el resultado:
Eso es. Ahora tendrá toda la fotografía que tomó en la orientación correcta.