Creare una Lens App con il Nokia Imaging SDK in Windows Phone 8

di Matteo Pagani, in Nokia Imaging SDK,

Le applicazioni fotografiche sono sicuramente tra le più interessanti e diffuse su Windows Phone, grazie anche all'attenzione di Nokia per il comparto fotografico dei telefoni della serie Lumia. Tutti i telefoni di fascia alta prodotti dalla casa finlandese, infatti, si contraddistinguono per la qualità delle fotocamere, in grado di scattare ottime foto anche in condizioni non eccezionali. Tra gli ultimi modelli spicca sicuramente il Lumia 1020, dotato di una fotocamera a 41 MP: proprio in contemporanea con il lancio di questo modello, Nokia ha rilasciato una libreria per gli sviluppatori in grado di semplificare notevolmente l'elaborazione delle immagini, compatibile non solo con i Lumia ma con tutti i dispositivi Windows Phone 8.

Nel corso di questo articolo vedremo le basi necessarie per creare un'applicazione fotografica e come sfruttare la libreria di Nokia, chiamata Imaging SDK, per renderla ancora più interessante.

Le Lens App, queste sconosciute

Con il termine Lens App ci si riferisce, solitamente, alle applicazioni fotografiche per Windows Phone 8: il nome deriva da una delle nuove feature introdotte nell'ultima versione della piattaforma, ovvero la possibilità di integrare la nostra applicazione all'interno dell'applicazione fotocamera nativa.

Uno dei punti di forza dei dispositivi Windows Phone, infatti, è la presenza di un tasto hardware dedicato alla fotocamera, che consente di lanciare l'applicazione nativa per l'acquisizione di foto e video in qualsiasi momento, anche se il telefono è bloccato. Purtroppo, le applicazioni di terze parti non possono beneficiare della stessa esperienza d'uso: l'utente è costretto a sbloccare il telefono, cercare la vostra applicazione nella home screen o nell'elenco delle app installate, avviarla e lanciare la procedura di acquisizione.

Le Lens App permettono di sopperire a questo limite: quando un'applicazione di terze parti viene registrata come "Lens App2, l'utente sarà in grado di lanciarla direttamente dalla fotocamera nativa, tramite una schermata dedicata attivabile tramite uno dei pulsanti nella application bar.

Prima di registrare la nostra applicazione nel sistema come Lens App, però, è importante capire i passaggi fondamentali per realizzare un'applicazione fotografica.

Costruiamo l'applicazione

Lo sviluppo di un'applicazione fotografica passa attraverso alcuni passaggi fondamentali:

  1. Dobbiamo definire il viewfinder, ovvero l'area all'interno della nostra pagina che mostrerà il flusso video in real time acquisito dalla fotocamera. In questo modo, l'utente potrà vedere cosa sta riprendendo prima di scattare la foto.
  2. Dobbiamo gestire correttamente l'orientamento: le applicazioni Windows Phone possono essere utilizzate sia in modalità portrait che in modalità landscape e questo ha un impatto sia sul flusso video in tempo reale, che sulla foto acquisita; entrambi, infatti, devono seguire l'orientamento del telefono, in modo che l'immagine visualizzata dall'utente sia poi quella effettivametne acquisita.
  3. Dobbiamo gestire l'acquisizione: lo scatto viene trattato, da parte delle API di Windows Phone, come l'acquisizione di una sequenza che, in realtà, per un limite dell'SDK, è composta da un unico frame contenente la foto acquisita.

Vediamo in dettaglio come implementare ogni singolo passaggio. Prima di iniziare, è importante evidenziare come sia necessario attivare la capability ID_CAP_ISV_CAMERA nel file di manifest ed, eventualmente, anche ID_CAP_MEDIALIB_PHOTO se vogliamo salvare le foto scattate nella libreria dell'utente.

Il ViewFinder

Come anticipato poco fa, il ViewFinder è l'area, all'interno della pagina, in cui viene mostrato il flusso video acquisito dalla fotocamera: in Windows Phone viene implementato tramite un Brush, ovvero gli oggetti XAML che consentono di definire il riempimento di un controllo. Ne esistono molteplici: SolidColorBrush (per usare un colore ), ImageBrush (per usare un'immagine), ecc; quello che fa al caso nostro si chiama VideoBrush, che serve proprio per mostrare un video. La differenza è che, nel nostro caso, non sarà un video già esistente, ma ci collegheremo direttamente al flusso della fotocamera. Il VideoBrush è un brush, per l'appunto, è di conseguenza va usato come "riempimento" di un controllo: è possibile utilizzare uno dei moltiplici "contenitori" presenti nello XAML, a cui assegnare il video come sfondo. Nell'esempio seguente, definiamo un Canvas con un VideoBrush come sfondo:

<Canvas Height="630" Width="480">
    <Canvas.Background>
        <VideoBrush x:Name="video" Stretch="Fill">
            <VideoBrush.RelativeTransform>
                <CompositeTransform x:Name="previewTransform" CenterX=".5" CenterY=".5" />
            </VideoBrush.RelativeTransform>
        </VideoBrush>;
    </Canvas.Background>;
</Canvas&gt>

Come potete notare al VideoBrush è stata applicata una trasformazione di tipo RelativeTransform: la utilizzeremo per gestire correttamente l'orientamento del ViewFinder e far si che, alla rotazione del device, corrisponda una corretta rotazione del flusso video acquisito.

Ora che abbiamo definito l'area in cui mostrare il flusso video, vediamo come da codice siamo in grado di agganciarlo alla fotocamera:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    Size resolution = PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back).First();
    PhotoCaptureDevice camera = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, resolution);
    previewTransform.Rotation = camera.SensorRotationInDegrees;
    ApplyOrientation();
    video.SetSource(camera);
}

La classe base con cui lavoriamo si chiama PhotoCaptureDevice e fa parte del namespace Windows.Phone.Media.Capture: il primo passo è quello di determinare la risoluzione a cui vogliamo acquisire il flusso video e, per tanto, sfruttiamo il metodo GetAvailableCatpureResolutions() per ottenere l'elenco delle risoluzioni supportate. Come parametro, occorre specificare la fotocamera che vogliamo utilizzare: nell'esempio, non è necessario alcun controllo preventivo perchè stiamo utilizzando la fotocamera principale (CameraSensorLocation.Back), che è presente in tutti i dispositivi Windows Phone sul mercato. Se, invece, volessimo utilizzare quella frontale, dovremmo prima verificare che sia presente nella collezione PhotoCaptureDevice.AvailableSensorLocations, dato che in alcuni device non è disponibile.

Il metodo GetAvailableCaptureResolutions() restituisce l'elenco di tutte le risoluzioni supportate all'interno di un array, ordinato dalla risoluzione più alta a quella più bassa: nell'esempio, decidiamo di sfruttare la prima, ovvero la massima disponibile. Dopodichè apriamo il flusso della fotocamera sfruttando il metodo OpenAsync() sempre della classe PhotoCaptureDevice, che richiede come parametri la fotocamera da utilizzare e la risoluzione scelta. L'ultimo passaggio è quello di impostare l'oggetto di tipo PhotoCaptureDevice restituito dal metodo OpenAsync() come sorgente del nostro VideoBrush: lo facciamo usando il metodo SetSource(). Attenzione, però, che dobbiamo includere nella nostra classe il namespace Microsoft.Devices: solo in questo modo avrete a disposizione una variante del metodo SetSource() in grado di accettare un oggetto di tipo PhotoCaptureDevice come parametro.

Supportare il Lumia 1020

Come probabilmente saprete, il Lumia 1020 ha la caratteristica di avere una fotocamera a 41 MPixel, in grado di scattare foto ad una qualità nettamente superiore rispetto a quella degli altri smartphone. Le modalità di acquisizione, però, sono differenti da quelle degli altri telefoni Windows Phone: il Lumia 1020, infatti, come impostazione predefinita, scatta le foto usando una risoluzione di 5 MPixel, così da rendere più agevole la condivisione via mail o sui social network (mantenendo la dimensione delle foto inferiore ai 2 MB, contro gli oltre 10 MB delle foto acquisite a 41 MPixel). Per questo motivo, l'applicazione predefinita per l'acquisizione di foto sul Lumia 1020 è Nokia Pro Cam, che è in grado di scattare, oltre alla foto a 5 Mpixel (che viene salvata nella galleria dell'utente per gli usi futuri), anche quella a 41 MPixel, che è resa disponibile nello storage del telefono e accessibile collegandolo al PC tramite il cavo USB. Le foto scattate avranno lo stesso nome, con la differenza che quella a massima qualità terminerà con il suffisso _highres (ad esempio, WP_20130909_20_37_49_Pro__highres.jpg).

Se vogliamo supportare il Lumia 1020 all'interno delle nostre applicazioni dobbiamo sfruttare uno stratagemma simile: mantenere una copia della foto a risoluzione più bassa nell'hub Photos e una a qualità più alta nello storage dell'applicazione, da mostrare e utilizzare quando richiesta. La differenza, rispetto all'inizializzazione tradizionale del ViewFinder vista in precedenza, è che dovremo forzare l'utilizzo della risoluzione a 41 MPixel: come impostazione predefinita, infatti, il metodo GetAvailableCaptureResolutions() restituirà come risoluzione massima quella a 5 MPixel. Se l'applicazione è in esecuzione su un Lumia 1020, invece, possiamo forzare la risoluzione di 7712x4352. Ecco come appare la nuova procedura di inizializzazione:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    Size resolution;
    string deviceName = DeviceStatus.DeviceName;
    if (deviceName.Contains("RM-875") || deviceName.Contains("RM-876") || deviceName.Contains("RM-877"))
    {
        resolution = new Size(7712, 4352);
    }
    else
    {
        resolution = PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back).First();
    }

    PhotoCaptureDevice camera = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, resolution);
    previewTransform.Rotation = camera.SensorRotationInDegrees;
    ApplyOrientation();
    video.SetSource(camera);
}

La classe DeviceStatus (inclusa nel namespace Microsoft.Phone.Info) consente di accedere a diverse informazioni sul telefono su cui è in esecuzione l'applicazione (è necessario abilitare la capability ID_CAP_IDENTITY_DEVICE nel file di manifest): nello specifico, la proprietà DeviceName ci dice il modello del telefono, che possiamo usare per determinare se è un Lumia 1020 oppure no (che viene identificato dalle sigle RM-875 per il mercato europeo, RM-876 per il mercato cinese e RM-877 per il mercato americano). In caso affermativo, possiamo forzare la risoluzione di 7712x4312, altrimenti utilizziamo la procedura tradizionale di richiedere l'elenco delle risoluzioni supportate e di usare quella più alta.

4 pagine in totale: 1 2 3 4

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc