Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Camera e WebCam API

Sfruttare l'SDK per catturare foto e video o creare applicazioni di realtà aumentata
Sfruttare l'SDK per catturare foto e video o creare applicazioni di realtà aumentata
Link copiato negli appunti

L'SDK di Windows Phone consente l'accesso alle funzionalità della foto/videocamera, dal semplice scatto di una foto fino alla cattura dello stream video in tempo reale, requisito indispensabile per creare applicazioni di scanning o di realtà aumentata.

Camera API

Le API permettono inoltre di gestire la risoluzione delle foto catturate, di lavorare con le impostazioni del flash e della messa a fuoco e di gestire gli eventi del pulsante hardware di scatto.

CameraCaptureTask

Il modo più semplice per consentire ai nostri utenti di scattare una foto dalle nostre applicazioni è tramite la classe CameraCaptureTask, in grado di lanciare una vera e propria applicazione esterna (dotata di gestione zoom, flash ecc.), al termine dell'attività la classe CameraCaptureTask riceverà in un event handler il risultato dell'operazione, ovvero la foto stessa.

Il vantaggio di questo metodo è la consistenza con la user experience del terminale: non dobbiamo inventare un'interfaccia utente speciale con il rischio di uscire dagli schemi dettati da Metro.

public partial class MainPage : PhoneApplicationPage
{
  CameraCaptureTask cameraCaptureTask;
  public MainPage()
  {
    InitializeComponent();
	cameraCaptureTask = new CameraCaptureTask();
	cameraCaptureTask.Completed += new EventHandler(cameraCaptureTask_Completed);
  }
  void cameraCaptureTask_Completed(object sender, PhotoResult e)
  {
    if (e.TaskResult == TaskResult.OK)
	{
	  BitmapImage bmp = new BitmapImage();
	  bmp.SetSource(e.ChosenPhoto);
	  PhotoImage.Source = bmp;
	}
  }
  private void Button_Click(object sender, RoutedEventArgs e)
  {
    cameraCaptureTask.Show();
  }
}

Definiamo a livello di classe una variabile di tipo CameraCaptureTask, nel costruttore agganciamo l'event handler di Completed; sul click di un pulsante lanciamo il metodo Show della classe, tale operazione eseguirà e passerà il controllo all'applicazione esterna per scattare la foto, a questo punto la nostra applicazione sarà in stato di sospensione, in attesa della conclusione dell'attività esterna.

Quando l'utente completerà il task la nostra applicazione sarà "risvegliata" dal runtime di Windows Phone e verrà invocato l'event handler di Completed; nel nostro esempio recuperiamo la foto appena scattata e la visualizziamo in un oggetto Image dell'interfaccia utente.

Nota: l'emulatore che troviamo nell'SDK consente un test completo dell'intero processo, comprende infatti una versione ridotta dell'applicazione esterna per la gestione della fotocamera.

PhotoCamera

Se vogliamo utilizzare la fotocamera del device senza passare da un task esterno occorre lavorare con le API della classe PhotoCamera. Tale classe consente di utilizzare funzionalità quali cattura delle immagini, messa a fuoco, gestione del flash. Proviamo a capire le caratteristiche essenziali con una semplice applicazione:

<Grid x:Name="LayoutRoot" Background="Transparent">
  <Canvas x:Name="viewfinderCanvas" Width="640" Height="480" >
    <!--Camera viewfinder -->
	<Canvas.Background>
	  <VideoBrush x:Name="viewfinderBrush" />
	</Canvas.Background>
  </Canvas>
</Grid>

Il sorgente XAML mostra l'interfaccia utente di un'applicazione Silverlight, il controllo più interessante è il Canvas chiamato viewfinderCanvas, che verrà usato come superficie sulla quale "proiettare" lo stream video in tempo reale proveniente dalla camera; avremmo potuto inserire anche un pulsante per scattare le foto, ma è una pratica da sconsigliare poiché Windows Phone ha un pulsante hardware dedicato a tale mansione, non è infatti buona regola ricreare tramite software funzionalità hardware già presenti sul device. Il codice del code-behind:

PhotoCamera cam;
protected override void OnNavigatedTo(… e)
{
  if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary))
  {
    cam = new PhotoCamera(CameraType.Primary);
	viewfinderBrush.SetSource(cam);
  }
}

Abbiamo definito a livello di classe una variabile di tipo PhotoCamera, essa sarà inizializzata nell'evento OnNavigatedTo dopo un controllo per verificare che il device abbia una webcam a bordo. Per catturare lo stream video è sufficiente impostare la sorgente di un VideoBrush con un'instanza di PhotoCamera. Ricordiamo che il VideoBrush, chiamato viewfinderBrush, è stato definito nel sorgente XAML dell'interfaccia utente e usato come Background di un oggetto Canvas.

La classe PhotoCamera espone altri eventi interessanti: Initialized, CaptureCompleted, CaptureImageAvailable, CaptureThumbnailAvailable.

Nel nostro esempio, dopo la pressione del pulsante hardware di scatto, potremmo salvare nel "rullino" la versione a piena risoluzione dell'immagine; per eseguire tale operazione dobbiamo agganciare l'evento CaptureImageAvailable:

cam.CaptureImageAvailable += new EventHandler(cam_CaptureImageAvailable);

All'interno dell'event handler è sufficiente usare la classe MediaLibrary e il relativo metodo SavePictureToCameraRoll per salvare l'immagine acquisita:

void cam_CaptureImageAvailable(object sender,ContentReadyEventArgs e)
{
  MediaLibrary library = new MediaLibrary();
  library.SavePictureToCameraRoll("foto.jpg", e.ImageStream);
}

WebCam API

Le due modalità mostrate finora sono anche chiamate "Windows Phone camera API", visto che sono comuni alle piattaforme XNA e Silverlight. Esiste inoltre la possibilità di usare delle API specifiche di Silverlight, chiamate Silverlight 4 WebCam API e vengono usate tipicamente per registrare audio o video in file. Una classe importante di questo insieme è rappresentato da CaptureSource, una sorta di controller per operazioni di cattura degli stream; mostriamo un esempio per visualizzare, registrare un filmato e salvarlo all'interno dell'Isolated Storage del device.

Oltre a CaptureSource e VideoCaptureDevice (rappresenta fisicamente la webcam), definiamo altre variabili che ci serviranno nelle operazioni di salvataggio.

private CaptureSource captureSource;
private VideoCaptureDevice videoCaptureDevice;
private FileSink fileSink;
private string videoFileName = "filmato.mp4";

Il nostro metodo InitializeVideoRecorder sarà chiamato tipicamente da un event handler di Loaded o OnNavigatedTo della Page, utilizzando il metodo Start di CaptureSource siamo in grado di catturare lo stream video che verrà usato da un VideoBrush (come nella precedente sezione) per visualizzare il contenuto proveniente dalla webcam.

public void InitializeVideoRecorder()
{
  if (captureSource == null)
  {
    captureSource = new CaptureSource();
	fileSink = new FileSink();
	videoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
	if (videoCaptureDevice != null)
	{
	  videoRecorderBrush.SetSource(captureSource);
	  captureSource.Start();
	}
  }
}

Per registrare un filmato occorre connettere l'input e l'output di un oggetto FileSink rispettivamente tramite le proprietà CaptureSource e IsolatedStorageFileName, ed eseguire successivamente il metodo Start, consentendo così una sincronizzazione tra la cattura e la registrazione fisica su file.

private void StartVideoRecording()
{
  if (captureSource.VideoCaptureDevice != null
      && captureSource.State == CaptureState.Started)
  {
    captureSource.Stop();
	fileSink.CaptureSource = captureSource;
	fileSink.IsolatedStorageFileName = videoFileName;
  }
  if (captureSource.VideoCaptureDevice != null
      && captureSource.State == CaptureState.Stopped)
  {
    captureSource.Start();
  }
}

Ti consigliamo anche