2013-06-14 15 views
6

Sto cercando di trovare un modo efficiente per passare un buffer di dati di immagine a un componente di Windows Runtime su Windows Telefono 8, riducendo al minimo il numero di volte in cui i dati del buffer necessitano da copiare. Una simile, ma più in generale, domanda è stata fatta prima:Passaggio di buffer di dati immagine a Windows Runtime su Windows Phone 8

Vedi Passing images from Windows (Phone) Runtime Components (c++/cx) to Native c++ Algorithms

Sfondo

Un articolo di MSDN sul tema può essere trovato here. Suggerisce di utilizzare un WriteableBitmap che può esporre il buffer di pixel sottostante come un oggetto IBuffer, che consente al componente nativo di manipolare i dati sul posto senza prima copiare il buffer.

Vedi How to get access to WriteableBitmap.PixelBuffer pixels with C++?

Tuttavia, il Windows.UI.Xaml.Media.Imaging spazio dei nomi che la WriteableBitmap fa parte non è disponibile per Windows Phone 8, solo Windows 8. Invece si può usare System.Windows.Media.Imaging.WriteableBitmap, ma dà solo l'accesso ai dati di immagine dei pixel in la forma di un int []. Un modo di convertire l'accaduto a un IBuffer è:

using System.Windows.Media.Imaging; 
using System.Runtime.InteropServices.WindowsRuntime; 

private static IBuffer AsBuffer(WriteableBitmap bitmap) 
{ 
    int[] p = bitmap.Pixels; 
    int len = p.Length * 4; 
    byte[] arr = new byte[len]; 
    Buffer.BlockCopy(p, 0, arr, 0, len); 
    return arr.AsBuffer(); // Part of System.Runtime.InteropServices.WindowsRuntime 
} 

ma comporta la copia inutile del buffer.

D'altro canto, il passaggio di matrici di byte di dati presenta i suoi svantaggi secondo questo MSDN article. Fondamentalmente, in Windows Runtime, i parametri sono o per l'input o per l'output, mai entrambi, il che significa che alla fine è necessaria una copia.

risposta ricercata

  • Come faccio a passare i dati in modo efficiente immagine attraverso lo strato di Windows Runtime?
  • Quali classi RT sono adatte al passaggio di immagini e al passaggio di flussi video? Array semplici o buffer più complessi?
+0

hai risolto? – tfzxyinhao

+0

Solo una FYI, 'Windows.UI.Xaml.Media.Imaging.WriteableBitmap' è disponibile in Windows Phone 8.1 – gannaway

risposta

0

api macchina fotografica per il codice nativo è la strada da percorrere: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj571202

otterrai i dati direttamente nel vostro C++ WinRT codice del componente. vedere un esempio qui: http://library.developer.nokia.com/Community/Wiki/Getting_started_with_the_Camera_APIs_for_native_code

+0

Il tuo suggerimento funziona solo quando acquisisci nuove immagini, non per foto o immagini altrimenti memorizzate. – Tomas

+0

Mi chiedo se è possibile trovare una soluzione per questo. Ho un byte [] che ho assegnato al buffer del componente nativo e quindi elaborato in nativo. Ora, sono bloccato su come associare questo a un WriteableBitmap. Una copia simile di tutti i byte a un int [] funzionerebbe probabilmente ma con un peggioramento delle prestazioni. e credo che non ci sia una cosa reinterpret_cast in .net. – bahti

Problemi correlati