C++ CGImageRef到char*数组

C++ CGImageRef到char*数组,c++,objective-c,cocoa,cgimage,C++,Objective C,Cocoa,Cgimage,我需要从窗口获取原始BRGA数据。从我所看到的情况来看,通常的做法是: int bgraDataLen = 0; CGImageRef windowImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, windowId, kCGWindowImageBoundsIgnoreFraming); CFDataRef bgraDataRef = CGDataProvide

我需要从窗口获取原始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会复制整个缓冲区。我想避免它,只需要一个指向原始数据的指针。我不介意它是只读的。有更好的方法吗?

下意识:没有。映像引用不能保证CPU可以访问映像数据或任何特定格式的数据。所持有的数据也可能发生变异。因此,复制语义提供了一种很好的指示方式,可以说“给我数据,让我来处理”

示例:

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