Я использую CALayer.backgroundFilters
, чтобы размыть родственные слои позади моего слоя, но я не могу заставить фильтр CIAffineClamp
работать так, как ожидалось. Это должно предотвратить размывание краев размытого изображения (как в этот вопрос ).
Вместо этого CIAffineClamp
вообще ничего не делает. Я тестировал как с, так и без, и создается одно и то же изображение. Примечание: Размытие - это , работающее, как и ожидалось, но не зажим.
У меня есть подкласс CIFilter
с методом outputImage
, подобным так :
- (CIImage *)outputImage
{
CIImage *image = [_inputImage imageByClampingToExtent];
image = [image imageByApplyingGaussianBlurWithSigma:_inputRadius];
image = [image imageByCroppingToRect:_inputImage.extent];
return image;
}
Я проверил, что и _inputImage
, и _inputRadius
существуют при вызове outputImage
.
Для ясности, imageByClampingToExtent
эквивалентно использованию явного CIAffineClamp
фильтр.
Вот метод, который создает мой пользовательский фильтр и применяет его, используя NSView#setBackgroundFilters
.
- (void)setBackgroundBlurRadius:(CGFloat)blurRadius
{
_backgroundBlurRadius = blurRadius;
if (_backgroundBlur == nil) {
_backgroundBlur = [BlurFilter new];
_backgroundBlur.name = @"blur";
[self ensureLayerExists];
self.backgroundFilters = @[_backgroundBlur];
}
[self.layer setValue:@(blurRadius)
forKeyPath:@"backgroundFilters.blur.inputRadius"];
}
Когда я проверяю возвращенные image
( см. скриншот ниже), я вижу, что входное изображение является GLTexture
. Может ли это быть проблемой?
Я получаю следующую ошибку при проверке окончательного image
:
Cannot render image (with an input GL texture) using a metal-IG context.
Как ни странно, размытое изображение отображается независимо от ошибки, но зажим никогда не применялось до размытия.