Получить UIImage из функции

Я написал функцию для применения фильтра к фотографии. Почему функция всегда возвращает ноль?

func getImage() -> UIImage? {
    let openGLContext = EAGLContext(api: .openGLES2)
    let context = CIContext(eaglContext: openGLContext!)

    let coreImage = UIImage(cgImage: image.cgImage!)

    filter.setValue(coreImage, forKey: kCIInputImageKey)
    filter.setValue(1, forKey: kCIInputContrastKey)

    if let outputImage = filter.value(forKey: kCIOutputImageKey) as? CIImage {
        let output = context.createCGImage(outputImage, from: outputImage.extent)
        return UIImage(cgImage: output!)
    }

    return nil
}

person nik3212    schedule 22.04.2017    source источник


Ответы (2)


При работе с coreImage в iOS необходимо учитывать классы coreImage, такие как CIFilter, CIContext, CIVector и CIColor и входное изображение должно быть CIImage, которое содержит данные изображения. Его можно создать из UIImage.

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

func getImage(inputImage: UIImage) -> UIImage? {
    let openGLContext = EAGLContext(api: .openGLES2)
    let context = CIContext(eaglContext: openGLContext!)

    let filter = CIFilter(name: "CIColorControls")
    let coreImage = CIImage(image: filterImage.image!)

    filter?.setValue(coreImage, forKey: kCIInputImageKey)
    filter?.setValue(5, forKey: kCIInputContrastKey)

    if let outputImage = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
    let output = context.createCGImage(outputImage, from: outputImage.extent)
        return UIImage(cgImage: output!)
    }

    return nil
}

Вы можете вызвать вышеуказанную функцию, как показано ниже.

filterImage.image = getImage(inputImage: filterImage.image!)

Вывод:

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

person Joe    schedule 22.04.2017

Вы никогда не вводите if в этом случае. Возможно, filter.value возвращает nil ИЛИ это не CIImage, который он возвращает. Извлеките его таким образом и установите точку останова в if или добавьте печать между:

let value = filter.value(forKey: kCIOutputImageKey)
if let outputImage = value as? CIImage {
    let output = context.createCGImage(outputImage, from: outputImage.extent)
    return UIImage(cgImage: output!)
}

Если вам нужна дополнительная информация, вы должны поделиться определением фильтра и кодом использования.

person ObjectAlchemist    schedule 22.04.2017