2012-12-10 11 views
5

Sto cercando il modo migliore per "battere" i dati bitmap RGB in modo rapido e ripetuto su un'area specifica all'interno di una finestra di Mac OS X, allo scopo di visualizzazione di frame video provenienti da un motore video personalizzato in tempo reale. I dati si trovano in un semplice array in stile C contenente una bitmap 32-BPP.Visualizzazione di video personalizzati (dati bitmap RGB) all'interno di una finestra Mac OS X

Su Win32, ho configurato HWND e HDC, copiare i dati grezzi nello spazio di memoria e quindi utilizzare BitBlt(). Su iOS, l'ho fatto tramite UIImageView, anche se non ho valutato appieno le prestazioni di tale approccio (in realtà non era necessario in quel particolare caso limitato). Non ho nessuno disponibile su Mac OS X con Cocoa, quindi cosa dovrei fare?

So che ci sono molti modi cattivi o contorti per realizzare questo, ma spero che qualcuno con esperienza possa indicarmi qualcosa che è effettivamente pensato per questo uso e/o è efficiente sotto il profilo delle prestazioni pur essendo ragionevolmente semplice e affidabile .

Grazie!

risposta

2

Si consiglia di creare NSImage s o CGImage s con i dati e quindi disegnarli nel contesto corrente.

Se si utilizza NSImage, è necessario creare un NSBitmapImageRep con i dati della vostra immagine. Non è necessario copiare i dati, basta passare il puntatore ad esso come uno dei parametri per l'inizializzatore.

Se si utilizza CGImage, è possibile creare un CGBitmapContextRef utilizzando CGBitmapContextCreate() e, come sopra, basta passare un puntatore ai dati di immagine esistenti. Quindi puoi creare un CGImage chiamando il numero CGBitmapContextCreateImage().

+0

Grazie. Non ho ancora valutato le prestazioni, ma questo sembra funzionare bene. – Wookie

0

Questo ha fatto il trucco ... (32-BPP RGBA dati bitmap)

int RowBytes = Width * 4; 

NSBitmapImageRep * ImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&Data pixelsWide:Width pixelsHigh:Height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:RowBytes bitsPerPixel:32]; 

NSImage * Image = [[NSImage alloc] init]; 
[Image addRepresentation:ImageRep]; 

[ImageView setImage:Image]; 

Rispetto a una bitmap di Windows, i canali blu e rosso sono invertiti (RGBA vs BGRA), e naturalmente la Y le righe sono nell'ordine opposto (cioè capovolte), ma è tutto abbastanza facile da gestire manipolando i dati di origine.

Problemi correlati