我目前正在开发一个远程桌面类型的项目,尤其是我正在尝试为以前使用的旧的过时方法提供替换代码。在大多数情况下,我已经相当成功地解决了这一问题,但是我似乎已经达到了绊脚石。

从OSX 10.7开始,已不再使用方法调用CGDisplayBaseAddress(1)。以前,这给了我内存中帧缓冲区的基地址,该地址在其他地方使用,以便查看屏幕的哪些部分已更改并确定需要发送到远程显示器的内容。现在,它返回NULL。

我当前的解决方案是使用CGDisplayCreateImage(2),它为我提供了CGImageRef,然后我可以使用它获取指向图像的原始数据的指针(通过CFDataRef对象-有关代码,请参见下文)。

这是最好的方法吗?当然,他们一定是更好的方法!

总结一下:我不想在屏幕上绘制任何东西,或者我只是想获取一个指向内存中第一个字节的指针,该字节包含桌面帧缓冲或(如我目前正在执行的)图像数据。

谢谢你提供的所有帮助! :)

当前解决方案代码:

CFDataRef copy_image_pixels(CGImageRef inImage) {
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage));
}

/**
 ret_byte_buffer is the byte buffer containing the pixel data for the image **/
void *getPixelDataForImage (CGImageRef image)
{
    //Check image ref is not null
    if (!image){
        NSLog(@"Error - image was null");
        return -1;
    }

    //Gets a CFData reference for the specified image reference
    CFDataRef pixelData = copy_image_pixels(image);
    //Gets a readonly pointer to the image data
    const UInt8 *pointerToData = CFDataGetBytePtr(pixelData); //This returns a read only version
    //Casting to a void pointer to return, expected to be cast to a byte_t *
    CFIndex length_of_buffer = CFDataGetLength(pixelData);
    printf("Size of buffer is %zu\n",length_of_buffer);
    return (void *)pointerToData;

}

获取CGImageRef的代码段-
osx_disp= main_screen_details->main_screenid; //Returns CGDirectDisplayID
CGImageRef screenShot = CGDisplayCreateImage(osx_disp);
byte_t *image_byte_data = getPixelDataForImage(screenShot);

将byte_t类型定义为无符号字符

最佳答案

从我的研究看来,您不再需要访问帧缓冲区。

他们上面我做过的方式可能不是最好的方式,但它确实可以满足我的需要:)

以前,您必须将显示器锁定为要执行的操作,然后再释放它,这有时会在释放屏幕时导致屏幕闪烁。

通过创建图像的新方法意味着您不必处理任何创建图像和黄金的问题:)

我要添加到现有代码中的一件事是,您必须记住释放CGImageRef或其主要内存泄漏。

为此,只需调用:

CFRelease(screenShot);

我们还需要以相同的方式释放pixelData对象。
CFRelease(pixelData);

关于macos - 访问帧缓冲区OSX 10.7,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13981093/

10-10 21:10