gpt4 book ai didi

ios - 通过 CVOpenGLESTextureCacheCreate 获取屏幕截图

转载 作者:行者123 更新时间:2023-11-29 11:08:57 28 4
gpt4 key购买 nike

我有一个类似于 GLPaint 示例的应用程序(但在 OpenGL ES 2.0 上)。我想在某些时候获得绘图 View 的屏幕截图。我已经读过这个 topic

但我不明白我应该在什么时候调用 CVOpenGLESTextureCacheCreate 并做其他事情。谁能帮帮我?

最佳答案

我在 the answer 中描述的代码您链接到描述了像素缓冲区的创建、其匹配纹理的提取以及将该纹理绑定(bind)为帧缓冲区的输出。您使用该代码一次来设置您将渲染场景的帧缓冲区。

每当您想要从该纹理中捕获时,您可能希望使用 glFinish() 进行阻塞,直到所有 OpenGL ES 渲染完成,然后使用我在此处描述的代码:

CVPixelBufferLockBaseAddress(renderTarget, 0);
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget);
// Do something with the bytes
CVPixelBufferUnlockBaseAddress(renderTarget, 0);

为包含场景图像的纹理提取原始字节。

iOS 纹理的内部字节顺序是 BGRA,因此您需要使用类似下面的内容从这些字节创建 CGImageRef:

// It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache
NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0;
NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)currentFBOSize.height * 4;
dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, _rawBytesForImage, paddedBytesForImage, dataProviderUnlockCallback);

cgImageFromBytes = CGImageCreate((int)currentFBOSize.width, (int)currentFBOSize.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault);

在上面,我使用了一个 dataProviderUnlockCallback() 函数来处理像素缓冲区的解锁和渲染的安全​​恢复,但是在你的情况下你可以忽略它并只为传递 NULL那里的参数。

关于ios - 通过 CVOpenGLESTextureCacheCreate 获取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12384848/

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