2016-12-26 12 views
0

xamarin.forms portableを使用してカメラから画像をキャプチャし、画像処理目的で画像byte []データにアクセスする必要があります。Xamarin:ポータブルアプリケーションの画像データ(表示用のみならず)

どうすればいいですか?

私は順番に、実際に写真を撮るためにxlabsを使用していますcameraViewModel.TakePicture()を起動xlabsボタンをクリック

public async Task<MediaFile> TakePicture() 
    { 
     Setup(); 

     ImageSource = null; 

     return await _Mediapicker.TakePhotoAsync (new CameraMediaStorageOptions { 
      DefaultCamera = CameraDevice.Front, MaxPixelDimension = 400 
     }).ContinueWith (t => { 
      if (t.IsFaulted) 
      { 
       Status = t.Exception.InnerException.ToString(); 
      } 
      else if (t.IsCanceled) 
      { 
       Status = "Canceled"; 
      } 
      else 
      { 
       MediaFile mediaFile = t.Result; 
       ImageSource = ImageSource.FromStream(() => mediaFile.Source); 

       return mediaFile; 
      } 

      return null; 
     }, _scheduler); 
    } 

private async void buttonTakePicture_Clicked() { 
     await cameraViewModel.TakePicture(); 
     imageView.Source = cameraViewModel.ImageSource; 
    } 

を使用して、画像を撮影し、単にそれを示して作業コードを持っていますデバイス上にあります。

イメージの生データを私に渡す(または別のコードを使用する)ようにコードを変更するにはどうすればよいですか?

おかげ

答えて

0

あなたはmediaFile.Pathを取り、DependencyServiceのためのパラメータとして渡すことができます。

//For Android 
public byte[] ByteArrayFromStream(string path) 
{ 
    var bitmap = BitmapFactory.DecodeFile(path); 

    byte[] bitmapData; 
    using(stream = new MemoryStream()) 
    { 
     bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream); 
     bitmapData = stream.ToArray(); 
    } 

    return bitmapData; 
} 

//For iOS 
public byte[] ByteArrayFromStream(string path) 
{ 
    UIImage originalImage = UIImage.FromFile(path); 
    return originalImage.AsPNG().ToArray(); 
} 

DependencyServiceについての詳細を学ぶためにあなたがで資料を入手することができます https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

+0

pathパラメータには何を指定する必要がありますか?カメラはどこに入りますか? – Gulzar

+0

'MediaFile mediaFile = t.Result;でカメラプラグインから取得したMediaFile Pathプロパティを渡す必要があります。 –

0

このPCLでバイト[]を得るのに役立ちます:

public async Task<MediaFile> TakePicture() 
{ 
    Setup(); 
    ImageSource = null; 
    return await _Mediapicker.TakePhotoAsync (new CameraMediaStorageOptions { 
     DefaultCamera = CameraDevice.Front, MaxPixelDimension = 400 
    }).ContinueWith (t => { 
     if (t.IsFaulted) 
     { 
      Status = t.Exception.InnerException.ToString(); 
     } 
     else if (t.IsCanceled) 
     { 
      Status = "Canceled"; 
     } 
     else 
     { 
      MediaFile mediaFile = t.Result; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       mediaFile.Source.CopyTo(ms); 
       byte[] attchmentbytes = ms.ToArray(); 
      } 
      ImageSource = ImageSource.FromStream(() => mediaFile.Source); 
      return mediaFile; 
     } 
     return null; 
    }, _scheduler); 
} 
+0

ありがとう!あなたのソリューションは画像を撮ってから、画像データをメモリストリームにコピーしてから再びバイト[]にコピーしますか、それともカメラが撮影したメモリ内のデータを参照していますか? データが何回コピーされたか、そしてこの量を最小限に抑える方法があるかどうかを知りたい。 – Gulzar

関連する問題