CGImageRef到char *数组

时间:2015-09-17 11:50:22

标签: c++ objective-c cocoa cgimage

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

1 个答案:

答案 0 :(得分:0)

Knee-jerk:不,没有。图像引用不保证具有CPU可以访问的图像数据,或者任何特定格式的数据。持有的数据也可能会发生变异。因此,复制语义提供了一个很好的标记方式来说明"给我数据并让我照顾它"。

示例:

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