2016-12-26 4 views
0

Je dois capturer une image de ma caméra en utilisant xamarin.forms portable, et obtenir l'accès aux données octet [] à des fins de traitement d'image.Xamarin: Comment capturer les données image (pas seulement pour l'affichage) sur l'application portable

Comment cela peut-il être fait?

J'ai le code de travail qui capture l'image et montre simplement, en utilisant 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); 
    } 

et

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

cliquant sur le bouton lance cameraViewModel.TakePicture() qui utilise à son tour xlabs pour prendre réellement la photo sur l'appareil.

Comment puis-je modifier le code pour me donner également les données brutes d'image (ou utiliser un code différent)?

Merci

Répondre

0

Vous pouvez prendre mediaFile.Path et le transmettre comme paramètre pour une 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(); 
} 

Pour en savoir plus sur DependencyService vous pouvez accéder à la documentation à l'adresse: https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

+0

que doit-on donner dans le paramètre path? D'où vient la caméra? – Gulzar

+0

vous devriez passer la propriété MediaFile Path que vous obtenez à partir du plugin de la caméra à 'MediaFile mediaFile = t.Result;' –

0

Cette vous aidera à obtenir octet [] en 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

Merci! Est-ce que votre solution prend la photo, puis copie les données d'image dans le flux de mémoire, puis à nouveau sur l'octet [], ou fait-elle référence aux données en mémoire, où la caméra l'a-t-elle pris? Je veux savoir combien de fois les données sont copiées, et s'il y a moyen de minimiser ce montant. – Gulzar