2013-03-14 1 views
10

Sto visualizzando il feed della videocamera nella mia app di Windows Store utilizzando CaptureElement. Ora mi piacerebbe catturare una foto come un flusso quando l'utente tocca il display, che ho lavorato usando il codice qui sotto. Purtroppo l'immagine restituita ha solo una risoluzione di 640 x 360, tuttavia la fotocamera (Surface RT) può scattare immagini con 1280x800, cosa che mi piacerebbe fare.Scatta foto con risoluzione personalizzata da CaptureElement con MediaCapture

ho provato a installare

 encodingProperties.Height = 800; 
     encodingProperties.Width = 1280; 

ma che non ha funzionato. Quindi come cambio la risoluzione?

private async void captureElement_Tapped(object sender, TappedRoutedEventArgs e) 
    { 
     var encodingProperties = ImageEncodingProperties.CreateJpeg(); 
     //encodingProperties.Height = 800; 
     //encodingProperties.Width = 1280; 
     WriteableBitmap wbmp; 

     using (var imageStream = new InMemoryRandomAccessStream()) 
     { 
      await captureMgr.CapturePhotoToStreamAsync(encodingProperties, imageStream); 
      await imageStream.FlushAsync(); 
      imageStream.Seek(0); 
      wbmp = await new WriteableBitmap(1, 1).FromStream(imageStream); 
     } 

     capturedImage.Source = wbmp; 
    } 

risposta

15

Così ho finalmente capito come venire da questo e anche sbarazzarsi del "HRESULT: 0xC00D36B4" temuto errore, in parte grazie al codice trovato qui: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/751b8d83-e646-4ce9-b019-f3c8599e18e0

ho fatto alcune modifiche, è per questo che ripubblicare il mio codice qui

MediaCapture mediaCapture; 
    DeviceInformationCollection devices; 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); 
     this.mediaCapture = new MediaCapture(); 
     if (devices.Count() > 0) 
     { 
      await this.mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings { VideoDeviceId = devices.ElementAt(1).Id, PhotoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.VideoPreview }); 
      SetResolution(); 
     } 
    } 


    //This is how you can set your resolution 
    public async void SetResolution() 
    { 
     System.Collections.Generic.IReadOnlyList<IMediaEncodingProperties> res; 
     res = this.mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview); 
     uint maxResolution = 0; 
     int indexMaxResolution = 0; 

     if (res.Count >= 1) 
     { 
      for (int i = 0; i < res.Count; i++) 
      { 
       VideoEncodingProperties vp = (VideoEncodingProperties)res[i]; 

       if (vp.Width > maxResolution) 
       { 
        indexMaxResolution = i; 
        maxResolution = vp.Width; 
        Debug.WriteLine("Resolution: " + vp.Width); 
       } 
      } 
      await this.mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview, res[indexMaxResolution]); 
     } 
    } 

Anche se scattare foto, assicurarsi che si lavora sempre con .VideoPreview, non .Photo!

+1

grazie, ho cercato questo, funziona alla grande! – Chin

+0

dopo che il pro 2 della superficie inizia a rallentare. – Yawar

+0

Questo metodo non funziona con l'acquisizione di foto – gayan1991