【发布时间】:2016-05-16 12:01:30
【问题描述】:
我发现 CIFilter 与 CIGaussianBlur 过滤器的行为非常奇怪。
我正在为不同的图像快速连续多次执行此方法。有时,会返回“最后处理的图像”而不是我发送的那个。例如,如果我有图像:
A、B 和 C。
如果我快速连续执行模糊,有时我会得到如下结果:
模糊 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 处的图像是正确的。)另外,请参阅代码中的 cmets 了解我尝试过的内容。
我错过了什么吗? CIFilter 是否有一些内部缓存?该方法始终在主线程上运行。
【问题讨论】:
-
介意告诉我投反对票的原因吗?我很乐意改进这一点。仅仅因为它是一个重要的问题并且很难解释它不应该成为反对的目标。
标签: ios uiimage core-image cifilter ciimage