GPUImage将过滤器应用于图像缓冲区

时间:2013-12-12 18:33:06

标签: ios objective-c opengl-es gpuimage

GPUImage中,有些过滤器仅适用于来自摄像机的帧流,例如低通滤波器或高通滤波器,但有很多过滤器。
我正在尝试创建一个UIImages缓冲区,它具有固定的时间速率,可以在两个图像之间应用这些滤镜,并且每对图像产生一个滤波后的图像。这样的事情:
FirstImage + SecondImage - > FirstFilteredImage
SecondImage + ThirdImage - > SecondFilteredImage
我发现使用框架的过滤器使用GPUImageBuffer,它是加载直通片段着色器的GPUImageFilter的子类(很可能只是为了继承一些方法和协议)。根据我的理解,这是一个保持传入帧但已经“纹理化”的缓冲区,通过在当前上下文中绑定纹理来生成纹理。
我发现-conserveMemoryForNextFrame对我想达到的目标来说听起来不错,但我没有得到如何工作。
有可能吗?在哪种方法图像转换为纹理?

1 个答案:

答案 0 :(得分:0)

我对我想要实现的目标做了一些接近,但首先我必须说,我可能误解了有关当前过滤器功能的一些方面。
我认为一些过滤器可以使一些操作在其着色器中考虑时间变量。那是因为当我看到低通滤波器和高通滤波器时,我立即想到了时间。现实似乎有所不同,它们考虑了时间,但这似乎不会影响过滤操作。
由于我自己开发了一个延时应用程序,它可以保存单个图像,并将它们重新组合成一个不同的时间线来制作一个没有音频的视频,我想象一个过滤时间函数可以很有趣地应用于后续帧。这就是为什么我发布这个问题的原因 现在的答案是:将双输入滤镜应用于静止图像,您必须在片段中执行:

    [sourcePicture1 addTarget:twoinputFilter];
    [sourcePicture1 processImage];
    [sourcePicture2 addTarget:twoinputFilter];
    [sourcePicture2 processImage];
    [twoinputFilter useNextFrameForImageCapture];
    UIImage * image = [twoinputFilter imageFromCurrentFramebuffer];

如果忘记调用-useNextFrameForImageCapture,由于缓冲区重用,返回的图像将为零 不高兴我想也许将来好的Brad会做出这样的事情,所以我创建了一个GPUImagePicture子类,而不是将kCMTimeIvalid返回到适当的方法,返回一个新的ivar,它包含名为{{的CMTime帧。 1}}。

-frameTime