【问题标题】:CGImageRef to char* arrayCGImageRef 到 char* 数组
【发布时间】:2015-09-17 11:50:21
【问题描述】:

我需要从窗口获取原始 BRGA 数据。据我所知,这样做的常见原因是:

    int bgraDataLen = 0;
    CGImageRef windowImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, windowId, kCGWindowImageBoundsIgnoreFraming);

    CFDataRef bgraDataRef = CGDataProviderCopyData(CGImageGetDataProvider(windowImage));
    bgraDataLen = CFDataGetLength(bgraDataRef);
    *bgraData = new unsigned char[bgraDataLen]; //This is what I need
    CFDataGetBytes(bgraDataRef, CFRangeMake(0, bgraDataLen), *bgraData);
    CGImageRelease(windowImage);
    CFRelease(bgraDataRef);

我对这个解决方案的问题是 CGDataProviderCopyData 会复制整个缓冲区。我想避免它,只需要一个指向原始数据的指针。而且我不介意它是只读的。有更好的方法吗?

【问题讨论】:

    标签: c++ objective-c cocoa cgimage


    【解决方案1】:

    下意识:不,没有。不保证图像引用具有 CPU 可以访问的图像数据,或任何特定格式的数据。持有的数据也可能发生变异。因此,复制语义提供了一种明确的方式来表达“给我数据,让我照看它”。

    例子:

    • 您正在对 GPU 上的某些内容进行快照,因此它可能不在 CPU 的地址空间中,并且很可能采用特定于 GPU 的格式(它们不倾向于线性布局,因为这在相当长的时间内缓存效率低下)几个常见的 GPU 用例)。如果您只绘制到另一个 GPU 缓冲区,那么数据可能永远不会到达 CPU。
    • 您使用了CGImageCreateWithPNGDataProvider,在这种情况下,API 保留在实际使用之前不对 PNG 进行解码的权利,然后将其解码为它认为合适的任何格式。所以图像会悄无声息地发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多