2012-12-10 6 views
5

Ich bin auf der Suche nach dem besten Weg, schnell und wiederholt RGB-Bitmap-Daten zu einem bestimmten Bereich innerhalb eines Mac OS X-Fensters zu "blit" Video-Frames anzeigen, die von einer benutzerdefinierten Video-Engine in Echtzeit stammen. Die Daten befinden sich in einem einfachen C-artigen Array mit einer 32-BPP-Bitmap.Anzeigen von benutzerdefiniertem Video (RGB-Bitmap-Daten) in einem Mac OS X-Fenster

Auf Win32 würde ich HWND und HDCs einrichten, die Rohdaten in den Speicherbereich kopieren und dann BitBlt() verwenden. Auf iOS habe ich es über UIImageView getan, obwohl ich die Leistung dieses Ansatzes nicht vollständig abgeschätzt habe (wirklich nicht in diesem speziellen begrenzten Fall). Ich habe weder Mac OS X noch Cocoa für Mac OS verfügbar. Was soll ich tun?

Ich weiß, dass es mehrere schlechte oder komplizierte Wege für mich gibt, um dies zu erreichen, aber ich hoffe, dass jemand mit Erfahrung mich auf etwas hinweisen kann, das eigentlich für diesen Zweck gedacht ist und/oder leistungsfähig ist, während es einfach und zuverlässig ist .

Danke!

Antwort

2

Ich würde entweder NSImage s oder CGImage s mit Ihren Daten erstellen und dann in den aktuellen Kontext zeichnen. Wenn Sie NSImage verwenden, müssen Sie einen NSBitmapImageRep mit den Daten Ihres Bildes erstellen. Sie müssen die Daten nicht kopieren, sondern übergeben Sie den Zeiger als einen der Parameter an den Initialisierer.

Wenn Sie CGImage verwenden, können Sie eine CGBitmapContextRef mit CGBitmapContextCreate() erstellen, und wie oben, übergeben Sie einfach einen Zeiger auf die vorhandenen Bilddaten. Dann können Sie eine CGImage davon erstellen, indem Sie CGBitmapContextCreateImage() aufrufen.

+0

Danke. Ich habe die Leistung noch nicht bewertet, aber das scheint gut zu funktionieren. – Wookie

0

Dies hat den Trick ... (32-BPP RGBA Bitmap-Daten)

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]; 

Im Vergleich zu einem Windows-Bitmap, die roten und blauen Kanäle vertauscht (RGBA vs BGRA), und natürlich die Y Zeilen sind in umgekehrter Reihenfolge (dh auf dem Kopf stehend), aber das ist alles leicht genug, um durch Manipulieren der Quelldaten unterzubringen.