繁体   English   中英

CIFilter输出图像随机显示先前的输出图像

[英]CIFilter output image is showing previous output image at random

我发现带有CIGaussianBlur过滤器的CIFilter行为很奇怪。

我针对不同的图像多次快速执行此方法。 有时,将返回“最后处理的图像”,而不是我发送的图像。例如,如果我有图像:

ABC。

如果我连续快速执行模糊处理,有时会得到如下结果:

模糊A模糊A模糊C

+(UIImage *)applyBlurToImageAtPath:(NSURL *)imageUrlPath
{
    if (imageUrlPath == nil)
        return nil;

    //Tried to create new contexts each loop, and also tried to use a singleton context
    //    if(CIImageContextSingleton == nil)
    //    {
    //        CIImageContextSingleton = [CIContext contextWithOptions:nil];
    //    }
    CIContext *context = [CIContext contextWithOptions:nil];//[Domain sharedInstance].CIImageContextSingleton;

    CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [gaussianBlurFilter setDefaults];
    CIImage *inputImage = [CIImage imageWithContentsOfURL:imageUrlPath];
    [gaussianBlurFilter setValue:inputImage forKey:kCIInputImageKey];
    [gaussianBlurFilter setValue:@(1) forKey:kCIInputRadiusKey];

    //Tried both these methods for getting the output image
    CIImage *outputImage = [gaussianBlurFilter valueForKey:kCIOutputImageKey];
//    CIImage *outputImage = [gaussianBlurFilter outputImage];

    //If I'm doing this, the problem never occurs, so the problem is isolated to the gaussianBlurFilter:
    //outputImage = inputImage;

    CGImageRef cgimg     = [context createCGImage:outputImage fromRect:[inputImage extent]];
    UIImage *resultImage = [UIImage imageWithCGImage:cgimg];

    //Tried both with and without releasing the cgimg
    CGImageRelease(cgimg);

    return resultImage;
}

我已经尝试过一次循环,并且在做手势之类时通过运行方法而出现了相同的问题。 (imageUrlPath上的图像是正确的。)此外,请参阅代码中有关我尝试过的内容的注释。

我想念什么吗? CIFilter是否有一些内部缓存? 该方法始终在主线程上运行。

根据给出的代码,并假设始终在主线程上调用此方法,您应该可以,但我确实看到了代码中不建议的某些事情:

  • 不要在每次调用该方法时重新创建CIContext 我建议以一种不同的方式进行结构设计,而不是作为一个Singleton。 进行大量渲染时,请保持CIContext周围,​​并重复使用相同的上下文。
  • 如果您的CIFilter没有更改,则也不必每次都重新创建它。 如果要在同一线程上调用该方法,则只需在过滤器上设置inputImage键。 每当输入图像更改时,您都需要从过滤器中获取新的outputImage

我的猜测是问题可能是围绕核心图像上下文渲染到相同的基础图形环境(可能是GPU渲染),但是由于您一直在不断重新创建CIContext,因此可能发生了一些不可思议的事情。

只是一个猜测,因为我没有方便的代码来测试自己。 如果您有一个演示该问题的测试项目,则调试起来会更容易。 另外-我仍然对线程持怀疑态度。 它在不应用模糊的情况下有效的事实并不一定证明它是导致问题的模糊-我的经验中,随机性更可能涉及线程问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM