2012-12-10 37 views
5

我正在尋找最佳方法來快速和反覆地將RGB位圖數據「blit」到Mac OS X窗口內的特定區域,以達到實時顯示來自定製視頻引擎的視頻幀。數據是一個簡單的C風格數組,包含一個32-BPP位圖。在Mac OS X窗口中顯示自定義視頻(RGB位圖數據)

在Win32中,我會建立HWND和HDC的,原始數據複製到它的內存空間,然後使用的BitBlt()。在iOS上,我通過UIImageView完成了它,儘管我沒有完全評估這種方法的性能(在特定的情況下並不需要這麼做)。我在Mac OS X上沒有Cocoa可用,所以我該怎麼做?

我知道有一些不好或令人費解的方式來完成這一點,但我希望有經驗的人能指點我實際上意味着這種用途和/或性能高效,同時合理直接和可靠。

謝謝!

回答

2

我會建議,要麼與您的數據創建NSImage S或CGImage秒,然後他們繪製到當前上下文。

如果您使用NSImage,則需要創建一個包含圖像數據的NSBitmapImageRep。您不需要複製數據,只需將指針作爲參數傳遞給初始值設定項即可。

如果使用CGImage,則可以使用CGBitmapContextCreate()創建CGBitmapContextRef,如上所述,只需將指針傳遞給現有圖像數據即可。然後你可以通過調用CGBitmapContextCreateImage()來創建一個CGImage

+0

謝謝。我還沒有評估表現,但這似乎很好。 – Wookie

0

這奏效了......(32 BPP RGBA位圖數據)

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

相比於Windows位圖,紅色和藍色通道交換(RGBA VS BGRA),當然還有的Y行的順序相反(即顛倒),但這很容易通過操縱源數據來適應。