Применение CIGaussianBlur к UIImage не работает должным образом - PullRequest
1 голос
/ 03 февраля 2020

Я хочу, чтобы эффект размытия составлял 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 filter

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 к изображению выше

Спасибо !!

1 Ответ

0 голосов
/ 04 февраля 2020

Ну, вы что-то делаете не так. Самый лучший совет, который я могу вам дать в вашей карьере, - это создать небольшой тестовый проект для экспериментов, когда у вас возникнет такая проблема - я делал это в течение 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()
    }

}
...