Использование CIAffineClamp и CIGaussianBlur с CALayer backgroundFilters - PullRequest
0 голосов
/ 06 января 2020

Я использую 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.

Как ни странно, размытое изображение отображается независимо от ошибки, но зажим никогда не применялось до размытия.

...