Мне нужно получить необработанные данные 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 создает копию всего буфера. Я хочу избежать этого и мне нужен только указатель на необработанные данные. И я не против, чтобы это было только для чтения. Есть ли лучший способ сделать это?
Колено: нет, нет. Ссылка на изображение не обязательно содержит данные изображения, к которым процессор может обращаться вообще, или данные в любом конкретном формате. Удерживаемые данные также могут видоизменяться. Таким образом, семантика копирования обеспечивает хорошо обозначенный способ сказать «дайте мне данные и дайте мне позаботиться о них».
Примеры:
CGImageCreateWithPNGDataProvider
, в этом случае API оставляет за собой право не декодировать этот PNG, пока он не будет фактически использован, а затем декодировать его в любой формат, который он считает подходящим. Таким образом, изображение молча мутирует.