gpt4 book ai didi

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

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

我发现 CIFilter 与 CIGaussianBlur 滤镜的行为非常奇怪。

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

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。我建议以不同的方式构建,而不是单例。保留您的 CIContext 并在执行大量渲染时重复使用相同的上下文。
  • 如果您的CIFilter没有改变,也没有必要每次都重新创建它。如果您在同一线程上调用该方法,则只需在过滤器上设置 inputImage 键即可。每当输入图像发生更改时,您都需要从过滤器获取新的 outputImage

我的猜测是,问题可能出在将 Core Image Context 渲染到相同的底层图形环境(可能是 GPU 渲染),但由于您不断地重新创建 CIContext,因此可能发生了一些奇怪的事情。

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

关于ios - CIFilter 输出图像随机显示先前的输出图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37253477/

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