Ricerca…


Osservazioni

  1. Questo esempio di app è disponibile sul mio GitHub di seguito:

https://github.com/Daniel-Krzyczkowski/XamarinAndroid/tree/master/AndroidPictureOrientation/PictureOrientationApp

  1. La documentazione dei componenti di Xamarin Mobile è disponibile di seguito:

https://components.xamarin.com/view/xamarin.mobile

Come correggere l'orientamento di un'immagine catturata dal dispositivo Android

Questo esempio mostra come acquisire l'immagine e visualizzarla correttamente sul dispositivo Android.

Per prima cosa dobbiamo creare un'applicazione di esempio con un pulsante e una vista di immagini. Una volta che l'utente fa clic sul pulsante, la fotocamera viene avviata e, dopo che l'utente ha selezionato l'immagine, verrà visualizzata con l'orientamento corretto sullo schermo.

  1. Aggiungi pulsante denominato "TakePictureButton" e vista immagine denominata "TakenPictureImageView":

inserisci la descrizione dell'immagine qui

  1. Ora apri il codice dell'attività dietro:

Qui in primo luogo ottieni un riferimento ai tuoi controlli:

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();
        };
    }
  1. Nella nostra applicazione useremo il componente Xamarin Mobile disponibile nel Components Store:

inserisci la descrizione dell'immagine qui

  1. Una volta che lo aggiungi al progetto, possiamo andare avanti. Aggiungi sotto il codice che è responsabile del lancio della telecamera. Questo metodo dovrebbe essere invocato nel clic del pulsante come puoi vedere nel codice precedente:

    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);
     }
    
  1. Una volta che l'utente prende l'immagine, dovremmo visualizzarla nell'orientamento corretto. Per farlo usa il metodo seguente. È responsabile del recupero delle informazioni exif dall'immagine scattata (incluso l'orientamento durante il momento in cui scatta la foto) e della creazione di bitmap con l'orientamento corretto:

    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;
         }
     }
    
  2. Il metodo sopra deve essere invocato nel metodo OnActivityResult richiamato dopo che l'utente ha scattato l'immagine:

    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());
             }
         }
     }
    
  3. Avvia l'applicazione. Scatta una foto e vedi il risultato:

inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui

Questo è tutto. Ora avrai tutte le foto scattate visualizzate con l'orientamento corretto.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow