4

カスタムビデオエンジンからのビデオフレームをリアルタイムで表示するために、RGBビットマップデータをMac OS Xウィンドウ内の特定の領域にすばやく繰り返し「ブリット」する最良の方法を探しています。データは、32 BPP ビットマップを含む単純な C スタイルの配列です。

Win32 では、HWND と HDC をセットアップし、生データをそのメモリ空間にコピーしてから、BitBlt() を使用します。iOS では、UIImageView を介して実行しましたが、そのアプローチのパフォーマンスを完全には評価していません (特定の限られたケースでは必要ありませんでした)。Mac OS X と Cocoa ではどちらも利用できません。どうすればよいですか?

これを達成するためにいくつかの悪い方法や複雑な方法があることは知っていますが、経験のある人が、実際にこの使用を意図したもの、および/またはパフォーマンス効率が高く、合理的に簡単で信頼できるものを教えてくれることを願っています.

ありがとう!

4

2 に答える 2

2

NSImageデータを使用してs またはCGImages を作成し、それらを現在のコンテキストに描画することをお勧めします。

を使用する場合は、イメージのデータをNSImage使用して を作成する必要があります。NSBitmapImageRepデータをコピーする必要はありません。データへのポインタをパラメータの 1 つとしてイニシャライザに渡すだけです。

を使用する場合は、 using をCGImage作成し、上記のように、既存の画像データへのポインターを渡すだけです。次に、 を呼び出して、そこから を作成できます。CGBitmapContextRefCGBitmapContextCreate()CGImageCGBitmapContextCreateImage()

于 2012-12-11T04:44:47.543 に答える
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 と BGRA)、もちろん Y 行は逆の順序 (上下逆) になっていますが、ソース データを操作するだけで簡単に対応できます。

于 2012-12-13T05:25:12.710 に答える