C++ CGImageRef到char*数组
我需要从窗口获取原始BRGA数据。从我所看到的情况来看,通常的做法是: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
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
- 您已经使用了
,在这种情况下,API保留在实际使用PNG之前不解码该PNG的权利,然后将其解码为其认为合适的任何格式。因此,图像会无声地发生变化CGImageCreateWithPNGDataProvider