Применение CIGaussianBlur к UIImage не работает должным образом

Я хочу, чтобы эффект размытия был UIImage при изменении значения ползунка.

Я использую фильтр CIGaussianBlur, чтобы размыть изображение.

Код выглядит следующим образом

func applyBlurFilter(aCIImage: CIImage, val: CGFloat) -> UIImage {
    let clampFilter = CIFilter(name: "CIAffineClamp")
    clampFilter?.setDefaults()
    clampFilter?.setValue(aCIImage, forKey: kCIInputImageKey)

    let blurFilter = CIFilter(name: "CIGaussianBlur")
    blurFilter?.setValue(clampFilter?.outputImage, forKey: kCIInputImageKey)
    blurFilter?.setValue(val, forKey: kCIInputRadiusKey)

    let rect = aCIImage.extent
    if let output = blurFilter?.outputImage {
        if let cgimg = self.context.createCGImage(output, from: rect) {
            let processedImage = UIImage(cgImage: cgimg)
            return processedImage
        }
    }
    return image ?? self.image
}

Примечание. Я также попробовал приведенный ниже код, используя фильтр CICrop.

func applyBlurFilter(beginImage: CIImage, value: Float) -> UIImage? {
    let currentFilter = CIFilter(name: "CIGaussianBlur")
    currentFilter?.setValue(beginImage, forKey: kCIInputImageKey)
    currentFilter?.setValue(value, forKey: kCIInputRadiusKey)

    let cropFilter = CIFilter(name: "CICrop")
    cropFilter?.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
    cropFilter?.setValue(CIVector(cgRect: beginImage!.extent), forKey: "inputRectangle")

    let output = cropFilter?.outputImage
    let context = CIContext(options: nil)
    let cgimg = self.context.createCGImage(output!, from: beginImage!.extent)
    let processedImage = UIImage(cgImage: cgimg!)
    return processedImage
}

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

Примечание. Я запускаю это на устройстве

Что я делаю не так, я понятия не имею

Изображение, правый край которого становится прозрачным

Результат после применения GaussianBlur к изображению выше

Спасибо!!


person Krima Shah    schedule 03.02.2020    source источник
comment
Вам нужно установить свойство экстента, но я точно не знаю. Читайте об этом и экспериментируйте.   -  person David H    schedule 03.02.2020
comment
Не могли бы вы попробовать использовать aCIImage.clampedToExtent в качестве входных данных для фильтра Гаусса? Теоретически он делает то же самое, что и CIAffineClamp-Фильтр, но кто знает.   -  person Paul Schröder    schedule 03.02.2020
comment
@DavidH Спасибо за ответ! Буду искать решение, которое вы дали   -  person Krima Shah    schedule 04.02.2020
comment
@PaulSchröder Спасибо за ответ! Я также пробовал использовать clippedToExtent, но у меня это не сработало.   -  person Krima Shah    schedule 04.02.2020
comment
Насколько велики те большие изображения, о которых вы говорите? Не могли бы вы опубликовать один из них или хотя бы ссылку. Где вы запускали свой код на реальном устройстве или на симуляторе?   -  person Paul Schröder    schedule 04.02.2020
comment
@PaulSchröder Пожалуйста, проверьте мой отредактированный вопрос для изображения, первое изображение — это изображение, при использовании которого размытие не работает, а второе изображение — это изображение, полученное после применения размытия. И я запустил свой код на реальном устройстве   -  person Krima Shah    schedule 04.02.2020
comment
Поместите изображение в Dropbox или подобное.   -  person David H    schedule 04.02.2020
comment
@DavidH Я дал ссылку на изображение в отредактированном вопросе, пожалуйста, проверьте его.   -  person Krima Shah    schedule 04.02.2020


Ответы (1)


Ну, ты где-то что-то делаешь не так. Абсолютно лучший совет, который я могу дать вам в вашей карьере, — создать небольшой тестовый проект для экспериментов, когда у вас возникнет такая проблема — я делал это в течение 15 лет в мире Apple, и это оказало огромную помощь.

Я создал проект здесь, поэтому вам не нужно (в это время). Я загрузил изображение, поместил его в ImageView, и оно выглядело идеально (как и ожидалось). Затем я использовал ваш код (за исключением того, что мне нужно было создать контекст и угадать значения радиуса, а затем запустить его. Изображение выглядит идеально с размытием 0, 5, 10 и 25.

Очевидно, проблема в чем-то другом, что вы делаете. Я предлагаю вам продолжать добавлять в тестовый проект до тех пор, пока вы не сможете определить, на каком этапе возникла проблема (контекст? другая обработка изображений?)

Это весь мой код:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        let im1 = UIImage(named: "Image.jpg")!
        let cim = CIImage(image: im1)!
        let im2 = applyBlurFilter(aCIImage: cim, val: 25)

        let iv = UIImageView(image: im2)
        iv.contentMode = .scaleToFill

        self.view.addSubview(iv)
    }

    func applyBlurFilter(aCIImage: CIImage, val: CGFloat) -> UIImage {
        let clampFilter = CIFilter(name: "CIAffineClamp")
        clampFilter?.setDefaults()
        clampFilter?.setValue(aCIImage, forKey: kCIInputImageKey)

        let blurFilter = CIFilter(name: "CIGaussianBlur")
        blurFilter?.setValue(clampFilter?.outputImage, forKey: kCIInputImageKey)
        blurFilter?.setValue(val, forKey: kCIInputRadiusKey)

        let rect = aCIImage.extent
        if let output = blurFilter?.outputImage {
            let context = CIContext(options: nil)
            if let cgimg = context.createCGImage(output, from: rect) {
                let processedImage = UIImage(cgImage: cgimg)
                return processedImage
            }
        }
        fatalError()
    }

}
person David H    schedule 04.02.2020
comment
Спасибо за вашу помощь и время! Я поищу точку, которую вы указали, и дам вам знать, если она сработает. - person Krima Shah; 05.02.2020