Xamarin:如何捕获便携式应用程序中的图像数据(不仅用于显示)

问题描述:

我需要使用xamarin.forms便携式摄像机从我的相机捕获图像,并获取对图像字节[]数据的访问权限以用于图像处理目的。Xamarin:如何捕获便携式应用程序中的图像数据(不仅用于显示)

这怎么办?

我有一个捕获图像,并只显示它,使用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; 
    } 

点击按钮启动cameraViewModel.TakePicture()又使用xlabs实际拍摄照片的工作代码在设备上。

我该如何修改代码以给我图像原始数据(或完全使用不同的代码)?

感谢

你可以把mediaFile.Path,并把它作为一个DependencyService参数: https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

+0

应该在路径参数中给出什么?相机在哪里? – Gulzar

+0

您应该通过'MediaFile mediaFile = t.Result;' –

此:

//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您可以访问文档将帮助您获得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

从相机插件获得的MediaFile路径属性谢谢!您的解决方案是否拍摄照片,然后将照片数据复制到存储器流中,然后再次复制到字节[],或者是否参考相机拍摄的内存中的数据? 我想知道数据被复制了多少次,以及是否有办法减少这个数量。 – Gulzar