gpt4 book ai didi

macos - 访问帧缓冲区 OSX 10.7

转载 作者:行者123 更新时间:2023-12-03 16:09:34 25 4
gpt4 key购买 nike

我目前正在开发一个远程桌面类型的项目,特别是我正在尝试为以前使用的旧的已弃用方法提供替换代码。在很大程度上,我已经相当成功地做到了这一点,但我似乎遇到了绊脚石。

从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com