Я нашел очень странное поведение для CIFilter с фильтром CIGaussianBlur.Выходное изображение CIFilter отображает предыдущее выходное изображение в случайном порядке
Я выполняю этот метод несколько раз в быстрой последовательности для разных изображений. ИНОГДА, «последнее обработанное изображение» будет возвращено вместо одного я отправить в Например, если у меня есть изображения:.
, В и C.
Если я выполнить размытие в быстрой последовательности, ИНОГДА я получаю результат, как:
расплылся, расплылся, Размытые 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;
}
Я пытался как в цикле и при запуске метода при создании жеста или таковой возникает одна и та же проблема. (Изображение на изображенииUrlPath верное.) Также см. Комментарии в коде для вещей, которые я пробовал.
Я что-то упустил? Есть ли встроенный кеш для CIFilter? Метод всегда работает на основном потоке.
Ум, говоря мне причину понижения? Я был бы более чем счастлив улучшить это. Просто потому, что это нетривиальная проблема и трудно объяснить, что она не должна быть целью для downvoting. – ullstrm