CIFilter - GaussianBlur - странные белые рамки

[Я изучаю Swift Development. В прошлый раз я пытался добавить размытия к изображению Рональда Рейгана. Сначала я нашел метод UIBlurEffect, но это было не совсем то, что я ожидал. Затем я попытался использовать метод CIFilter. Я прошел через ужасный путь внедрения CGaussianBlur, но в конце концов я это сделал! Затем я заглянул в раскадровку и обнаружил, что изображение было масштабировано и отмечено белыми рамками (как вы можете видеть на прикрепленном рисунке). Что я сделал не так? Что я должен делать? Есть ли более простой способ добавить размытие на фото программно? Я знаю, что есть способ сделать это с помощью сторонних приложений, таких как Adobe PS, но я хочу, чтобы это было в коде. :)

import UIKit

@IBDesignable
class blurImageView: UIImageView {

    override func awakeFromNib() {
        super.awakeFromNib()
        applyBlurEffect(image: image!)
    }
    
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        applyBlurEffect(image: image!)
    }
    
    func applyBlurEffect(image: UIImage){
        
        if self.image != nil {
        let imageToBlur = CIImage(image: image)
        let blurfilter = CIFilter(name: "CIGaussianBlur")!
        blurfilter.setValue(imageToBlur, forKey: "inputImage")
        let resultImage = blurfilter.value(forKey: "outputImage") as! CIImage
        let blurredImage = UIImage(ciImage: resultImage)
            self.image = blurredImage
        
        }
    }
}

введите здесь описание изображения


person Czkii    schedule 12.07.2020    source источник


Ответы (1)


Добро пожаловать!

CIGaussianBlur (и другие сверточные фильтры из Core Image) увеличивают размер изображения на область, которая зависит от размера размытия.

Вы можете просто обрезать размер входного изображения, чтобы избавиться от этого поля:

let blurredImage = UIImage(ciImage: resultImage.cropped(to: imageToBlur.extent))

Кстати, рекомендую вам import CoreImage.CIFilterBuiltins. Это даст вам приятный типобезопасный интерфейс для большинства фильтров Core Image:

let input = CIImage(image: image)!
let blurFilter = CIFilter.gaussianBlur()
blurFilter.inputImage = input
blurFilter.radius = 10
let output = blurFilter.outputImage?.cropped(to: input.extent)
self.image = UIImage(ciImage: output!)
person Frank Schlegel    schedule 12.07.2020
comment
Работал! Люблю тебя, мужчина! - person Czkii; 12.07.2020