サーチ…


備考

  1. このアプリサンプルは私のGitHubで利用できます:

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

  1. Xamarin Mobileコンポーネントのドキュメントは以下のとおりです。

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

Androidデバイスからキャプチャした画像の向きを修正する方法

この例では、Androidデバイスでイメージを取得して正しく表示する方法を示します。

まず、1つのボタンと1つの画像ビューでサンプルアプリケーションを作成する必要があります。ユーザーがボタンをクリックすると、カメラが起動し、ユーザーが画像を選択すると、画面に適切な向きで表示されます。

  1. "TakePictureButton"という名前のボタンと "TakenPictureImageView"という名前の画像ビューを追加します。

ここに画像の説明を入力

  1. 今度はアクティビティコードを開いてください:

まず、あなたのコントロールへの参照を取得します。

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. アプリケーションでは、コンポーネントストアで利用できるXamarin Mobileコンポーネントを使用します。

ここに画像の説明を入力

  1. それをプロジェクトに追加すると、私たちは進むことができます。カメラを起動するコードを以下に追加してください。このメソッドは、上記のコードで見られるように、ボタンのクリックで呼び出される必要があります:

    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. ユーザーが写真を撮影すると、適切な方向に表示する必要があります。これを行うには以下の方法を使用します。これは、撮影された画像からexif情報を取得すること(写真撮影の瞬間の方向付けを含む)と、適切な向きのビットマップを作成することとを担当する。

    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. 上記のメソッドは、ユーザーが写真を撮った後に呼び出されるOnActivityResultメソッドで呼び出されます。

    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. アプリケーションを起動します。写真を撮って結果を見る:

ここに画像の説明を入力 ここに画像の説明を入力

それでおしまい。今度はあなたが撮った写真をすべて正しい方向に表示させます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow