GPUImage在iOS 8中崩溃

时间:2014-09-20 08:49:50

标签: ios gpuimage

我已经实现了一个具有许多过滤器的过滤工具机制。每个过滤器包含2-3个不同的过滤器,即我正在使用GPUImageFilterGroup。现在,当我更新GPU图像库兼容iOS 8时,它显示“未找到实例方法prepareForImageCapture”并且应用程序崩溃。

enter image description here

我还试图实现以下代码

GPUImageFilterGroup *filter = [[GPUImageFilterGroup alloc] init];

    GPUImageRGBFilter *stillImageFilter1 = [[GPUImageRGBFilter alloc] init];
//    [stillImageFilter1 prepareForImageCapture];

    stillImageFilter1.red = 0.2;
    stillImageFilter1.green = 0.8;
        [stillImageFilter1 useNextFrameForImageCapture];
    [(GPUImageFilterGroup *)filter addFilter:stillImageFilter1];

    GPUImageVignetteFilter *stillImageFilter2 = [[GPUImageVignetteFilter alloc] init];
//    [stillImageFilter1 prepareForImageCapture];
    stillImageFilter2.vignetteStart = 0.32;
    [stillImageFilter1 useNextFrameForImageCapture];
    [(GPUImageFilterGroup *)filter addFilter:stillImageFilter2];

    [stillImageFilter1 addTarget:stillImageFilter2];

    [(GPUImageFilterGroup *)filter setInitialFilters:[NSArray arrayWithObject:stillImageFilter1]];
    [(GPUImageFilterGroup *)filter setTerminalFilter:stillImageFilter2];

    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image];
    [stillImageSource addTarget:(GPUImageFilterGroup *)filter];
    [stillImageSource processImage];

    UIImage *img = [(GPUImageFilterGroup *)filter imageFromCurrentFramebuffer];

它返回的nil图像。谁能告诉我什么是正确的方法!!!

提前致谢。

1 个答案:

答案 0 :(得分:3)

首先,这不是iOS 8的崩溃。你暂时没有更新你的GPUImage副本,并且这个方法在几个月前在与任何iOS兼容性无关的更新中被删除了。解释原因here,我再次引用相关段落:

  

这确实会给界面增添一点轻微的皱纹,而且我已经   更改了一些方法名称,以便更新任何人更新   码。因为帧缓冲区现在是瞬态的,如果你想要捕获   来自其中一个的图像,您必须在处理之前对其进行标记。您   通过在筛选器上使用-useNextFrameForImageCapture方法来执行此操作   表示下次将图像传递到过滤器时   链,你想要坚持使用那个帧缓冲   再多拿一张图片就可以了。 -imageByFilteringImage:   现在自动为你做这个,我又添加了另一个   在processImageUpToFilter:withCompletionHandler中的便捷方法:   以异步方式执行此操作。

如您所见,-prepareForImageCapture已被删除,因为它在新的缓存系统中没用。

您更新的代码返回nil的原因是您在错误的过滤器上调用了-useNextFrameForImageCapture。它需要在组中的终端过滤器(stillImageFilter2)上调用,并且只需要在调用-processImage之前调用一次。这表示这个特定的帧缓冲区需要长时间闲置才能从中捕获图像。

您真的不需要上面的GPUImageFilterGroup,因为它只会使您的过滤器链变得复杂。