4

我正在寻找快速重复地将 RGB 位图数据“blit”到 Mac OS X 窗口中的特定区域的最佳方法,以便实时显示来自自定义视频引擎的视频帧。数据位于包含 32-BPP 位图的简单 C 样式数组中。

在 Win32 上,我会设置 HWND 和 HDC,将原始数据复制到其内存空间,然后使用 BitBlt()。在 iOS 上,我通过 UIImageView 完成了它,尽管我没有完全评估这种方法的性能(在那种特殊的有限情况下真的不需要)。我在带有 Cocoa 的 Mac OS X 上都无法使用,我该怎么办?

我知道我有几种糟糕或复杂的方法来实现这一点,但我希望有经验的人可以指出一些实际上是用于这种用途的东西和/或性能高效的东西,同时相当简单和可靠。

谢谢!

4

2 回答 2

2

我建议使用您的数据创建NSImages 或CGImages ,然后将它们绘制到当前上下文中。

如果使用NSImage,则需要使用NSBitmapImageRep图像数据创建一个。您不需要复制数据,只需将指向它的指针作为参数之一传递给初始化程序。

如果你使用CGImage,你可以创建一个CGBitmapContextRefusing CGBitmapContextCreate(),和上面一样,只需传递一个指向现有图像数据的指针。然后你可以CGImage通过调用从它创建一个CGBitmapContextCreateImage()

于 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 回答