我目前正在开发一个远程桌面类型的项目,特别是我正在尝试为以前使用的旧的过时方法提供替换代码。在大多数情况下,我已经相当成功地做到了这一点,但我似乎遇到了一个绊脚石。
从 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 被 typedef 为无符号字符