Почему мой CIImage nil после того, как я инвертирую UIImage? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть очень специфическая проблема, когда я конвертирую UIImage в CIImage после того, как я инвертировал UIImage. Вот код:

let imageFromBuffer1 = self.imageInvert(image: self.imageFromBuffer)
let ciImage = CIImage(image: imageFromBuffer1)

Итак, в приведенном выше коде ciImage имеет значение ноль по какой-то причудливой причине. Кто-нибудь может объяснить это или сказать мне, что еще нужно сделать, чтобы преобразовать UIImage в CIImage?

Это функция инвертирования, которую я использую выше:

func imageInvert(image: UIImage) -> UIImage{
    let beginImage = CIImage(image: image)
    var newImage = UIImage()
    if let filter = CIFilter(name: "CIColorInvert") {
        filter.setValue(beginImage, forKey: kCIInputImageKey)
        let ciImage = filter.outputImage
        newImage = UIImage(ciImage: ciImage!)

    }
    else{
        print("filter does not exist")
        newImage = image
    }

    return newImage
}

1 Ответ

0 голосов
/ 01 ноября 2018

Поскольку при преобразовании изображения из одной формы в другую некоторые данные могут быть изменены, утеряны или не использованы. Например, когда вы загружаете UIImage из ресурсов, оно может быть больше, чем представление, в котором оно отображается. Графический движок делает все возможное, чтобы изображение отображалось максимально правдоподобно. Однако некоторые данные базового изображения могут не использоваться, это особенно верно для сжатых изображений JPEG. Вместо преобразования изображения туда и обратно рассмотрите возможность преобразования текущего контекста, в котором находится изображение:

ViewController.swift

import UIKit

class ViewController: UIViewController {

    lazy var imageView = UIImageView(frame: self.view.frame)

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(imageView)

        let tap = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
        imageView.addGestureRecognizer(tap)
        imageView.isUserInteractionEnabled = true
        imageView.contentMode = .scaleAspectFit
        // https://en.wikipedia.org/wiki/File:Meisje_met_de_parel.jpg
        imageView.image = UIImage(named: "Meisje_met_de_parel.jpg")

    }

    func invert(image: UIImage) -> UIImage? {

        let ciImage = CIImage(image: image)
        var newImage:UIImage? = nil
        guard let filter = CIFilter(name: "CIColorInvert") else {return image}
        filter.setValue(ciImage, forKey: kCIInputImageKey)
        let context = CIContext(options: nil)

        if let outputImage = filter.outputImage, let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
            newImage = UIImage(cgImage: cgImage)
        }

        return newImage

    }

    @objc func imageViewTapped() {
        if let image = self.imageView.image {
            let invertedImage = self.invert(image: image)
            DispatchQueue.main.async {
                self.imageView.image = invertedImage
            }
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...