【问题标题】:Displaying custom video (RGB bitmap data) within a Mac OS X Window在 Mac OS X 窗口中显示自定义视频(RGB 位图数据)
【发布时间】:2012-12-10 22:47:41
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: macos cocoa bitmap window rgb


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我还没有评估性能,但这似乎运作良好。
    【解决方案2】:

    这成功了……(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 行的顺序是相反的(即倒置),但这很容易通过操纵源来适应数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多