我需要从窗口获取原始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会复制整个缓冲区。我想避免它,只需要一个指向原始数据的指针。我不介意它是只读的。有没有更好的方法呢?
答案 0 :(得分:0)
Knee-jerk:不,没有。图像引用不保证具有CPU可以访问的图像数据,或者任何特定格式的数据。持有的数据也可能会发生变异。因此,复制语义提供了一个很好的标记方式来说明"给我数据并让我照顾它"。
示例:
CGImageCreateWithPNGDataProvider
,在这种情况下,API保留在实际使用之前不对该PNG进行解码,然后将其解码为其认为合适的任何格式的权利。所以图像默默地变异。