我需要从窗口获取原始的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会复制整个缓冲区。我想避免它,只需要一个指向原始数据的指针。我不介意它是只读的。有没有更好的方法呢?
发布于 2015-09-17 20:53:34
下意识:不,没有。一个图像引用根本不能保证有CPU可以访问的图像数据,或者任何特定格式的数据。保存的数据也可能发生变化。因此,复制语义提供了一种很好的方式来表示“给我数据,让我来照看它”。
示例:
CGImageCreateWithPNGDataProvider,在这种情况下,API保留在实际使用之前不解码该PNG的权利,然后将其解码为它认为合适的任何格式。因此,图像会悄悄地发生变化。https://stackoverflow.com/questions/32629638
复制相似问题