У меня возникают проблемы с попыткой размыть часть экрана в приложении iOS. Смотрите изображение, чтобы лучше понять, что я пытаюсь сделать.
Только содержимое "BlurBox" должно быть размытым, но остальное может быть понятным. Поэтому, если вы смотрите на представление таблицы, только контент под BlurBox будет размытым (даже при прокрутке). Остальное выглядело бы ясным.
Мой первый подход состоял в том, чтобы называть UIGraphicsGetImageFromCurrentImageContext()
каждый .01s, чтобы все слои под BlurBox были объединены в одно изображение. Затем размыте это изображение и отобразите его на все.
Методы, которые я пробовал для размытия, следующие:
https://github.com/tomsoft1/StackBluriOS
https://github.com/coryleach/UIImageAdjust
https://github.com/esilverberg/ios-image-filters
https://github.com/cmkilger/CKImageAdditions
[layer setRasterizationScale:0.25];
[layer setShouldRasterize:YES];
Как и несколько пользовательских попыток. Я также посмотрел на Apple GLImageProcessing, но я думаю, что это немного переборщило с тем, что я пытаюсь сделать здесь.
Проблема заключается в том, что все они - медленные. Приложение не входит в хранилище приложений, поэтому я открыт для использования любых закрытых/недокументированных фреймворков.
Я хотел бы отказаться от метода drawRect
всех компонентов, которые я использую (UITableViewCells, UITableView и т.д.) и размыть каждый из них независимо друг от друга на лету. Однако это займет некоторое время, это даже похоже на жизнеспособный вариант?
UPDATE
Я попытался использовать CIFilters
следующим образом:
CIImage *inputImage = [[CIImage alloc] initWithImage:[self screenshot]];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue: inputImage forKey: @"inputImage"];
[blurFilter setValue: [NSNumber numberWithFloat:10.0f]
forKey:@"inputRadius"];
CIImage *outputImage = [blurFilter valueForKey: @"outputImage"];
CIContext *context = [CIContext contextWithOptions:nil];
self.bluredImageView.image = [UIImage imageWithCGImage:[context createCGImage:outputImage fromRect:outputImage.extent]];
Это работает, однако это невероятно медленно.: (
Я вижу, что некоторые реализации будут размыты, только когда я передам изображение, загруженное с диска. Если я передаю UIImage, который я создал с помощью UIGraphicsGetImageFromCurrentImageContext()
, он не работает. Любые идеи о том, почему это было бы?
UPDATE
Я попробовал следующее предложение:
CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
Однако это не работает: (
ОБНОВЛЕНИЕ ПОСЛЕ BOUNTY ADDED:
Мне удалось корректно работать с BlurBox, используя TomSoft1 stackblur, так как он добавил возможность нормализовать изображение в формате RGBA (32 бит /pixel ) на лету. Тем не менее, он все еще довольно медленный.
У меня есть таймер, вызывающий обновление каждые 0,03 секунды, чтобы захватить изображение того, что находится под BlurBox, размыть это изображение и отобразить его на экране. Мне нужна помощь по увеличению "fps" на BlurBox.