CIAdditionCompositing seg faults - PullRequest
       36

CIAdditionCompositing seg faults

0 голосов
/ 28 января 2019

Я пытаюсь создать фильтр смещения наклона согласно инструкциям Apple , но как только я пытаюсь получить outputImage из фильтра CIAdditionCompositing, я получаю ошибку сегмента.Этот код я использую как расширение для UIImage.Что я делаю не так?

public func tiltShift() -> UIImage? {
    guard let backingCi = ciImage ?? CIImage(image: self) else {
        return nil
    }

    let blurred = backingCi.applyingGaussianBlur(sigma: 10)

    var gradientParameters = [
        "inputPoint0": CIVector(x: 0, y: 0.75 * size.height),
        "inputColor0": CIColor(red: 0, green: 1, blue: 0, alpha: 1),
        "inputPoint1": CIVector(x: 0, y: 0.5 * 10),
        "inputColor1": CIColor(red: 0, green: 1, blue: 0, alpha: 0)
    ];

    guard let inputGradient = CIFilter(name: "CILinearGradient", parameters: gradientParameters),
        let inputImage = inputGradient.outputImage else {
            return nil
    }

    gradientParameters["inputPoint0"] = CIVector(x: 0, y: 0.25 * size.height)

    guard let backgroundGradient = CIFilter(name: "CILinearGradient", parameters: gradientParameters),
        let backgroundImage = backgroundGradient.outputImage else {
            return nil
    }

    let maskParameters = [
        "inputImage": inputImage,
        "inputBackgroundImage": backgroundImage
    ]

    guard let mask = CIFilter(name: "CIAdditionCompositing", parameters: maskParameters),
        let maskedImage = mask.outputImage else {  // <=- This line aborts
            return nil
    }

    let combinedParameters = [
        "inputImage": blurred,
        "inputBackgroundImage": self,
        "inputMaskImage": maskedImage
    ]

    guard let blend = CIFilter(name: "CIBlendWithMask", parameters: combinedParameters) else {
        return nil
    }

    let context = CIContext(options: nil)

    guard let blendImg = blend.outputImage,
        let cgimg = context.createCGImage(blendImg, from: blendImg.extent) else { return nil }

    return UIImage(cgImage: cgimg)
}

1 Ответ

0 голосов
/ 28 января 2019

Вы используете UIImage вместо CIImage в combinedParameters, а UIImage не имеет extent метода, поэтому вы получаете сбой.Вам нужно использовать CIImage, созданное сверху из текущего изображения, как показано ниже,

let combinedParameters = [
    "inputImage": blurred,
    "inputBackgroundImage": backingCi,
    "inputMaskImage": maskedImage
]
...