CGImageRef to char * массив

Мне нужно получить необработанные данные 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

Решение

Колено: нет, нет. Ссылка на изображение не обязательно содержит данные изображения, к которым процессор может обращаться вообще, или данные в любом конкретном формате. Удерживаемые данные также могут видоизменяться. Таким образом, семантика копирования обеспечивает хорошо обозначенный способ сказать «дайте мне данные и дайте мне позаботиться о них».

Примеры:

  • вы снимаете что-то на GPU, так что оно может не находиться в адресном пространстве CPU и может быть в формате, специфичном для GPU (они обычно не располагаются линейно, потому что кэш неэффективен для многих распространенных GPU случаи применения). Если вы обращаетесь только к другому буферу графического процессора, данные могут никогда не попасть в процессор.
  • ты использовал CGImageCreateWithPNGDataProvider, в этом случае API оставляет за собой право не декодировать этот PNG, пока он не будет фактически использован, а затем декодировать его в любой формат, который он считает подходящим. Таким образом, изображение молча мутирует.
0

Другие решения


По вопросам рекламы [email protected]