Составьте изображения таким образом, чтобы один был по центру и имел одинаковую ширину над другим. - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь добиться этого результата: enter image description here

Я создаю градиентное изображение с соотношением сторон 16: 9.

Это мой код:

extension UIImage {
    func mergeWithGradient(completion: @escaping (UIImage)->()){

        let width = self.size.width

        let maxWidth = min(width, 1024.0)
        let height = maxWidth * 16.0 / 9.0
        let totalSize = CGSize(width: maxWidth, height: height)

        let colors = self.colors()

    guard
        let gradientImage = UIImage(size: totalSize, gradientPoints: [(colors.top,0), (colors.bottom,1)].map{ GradientPoint(location: $0.1, color: $0.0)}),
        let cgImage = self.rotateToImageOrientationUp().cgImage,
        let cgGradientImage = gradientImage.cgImage
            else {
        return

    }
    let context = CIContext.init(options: nil)
    var ciImage = CIImage(cgImage: cgImage)

    let ciGradientImage = CIImage(cgImage: cgGradientImage)

    let ciMerged = ciImage.composited(over: ciGradientImage)
        let cgMerged = context.createCGImage(ciMerged, from: ciMerged.extent)!
        let uiMerged = UIImage.init(cgImage: cgMerged)


        completion(uiMerged)

    }
}

Но прикрепленный код фактически получает такой результат: enter image description here

Как я могу переместить изображение в центр? Это действительно легко с CoreGraphics, но мне нужно сделать это с CoreImage, так как позже моему проекту понадобятся дополнительные фильтры и хорошая производительность.

1 Ответ

1 голос
/ 08 января 2020

Если вы хотите использовать Core Image для слияния изображений при центрировании наложения, то самый простой способ сделать это - просто сделать наложенное изображение того же размера, что и градиентное изображение для начала, и просто почтовый ящик. это с прозрачными пикселями. Вы можете сделать это с помощью UIGraphicsIamgeRender, прежде чем конвертировать в CIImage.

...