iOS:与Core Graphics混合的图像

问题描述 投票:0回答:1

我想使用Core Graphics混合两个图像。

例如,我有一个图像:

enter image description here

此图像代表框架。我想将此图像切片。

另一张图片代表背景:

enter image description here

我想要实现的目标是将这两个图像视为:

enter image description here

重要的是,这个图像可能不一定是圆形的。它可能是可切片的。

如何通过使用Core Graphics实现这一目标?

ios swift image core-graphics blending
1个回答
0
投票

尝试使用以下使用遮罩的方法(maskImage是代表“框架”的方法,因此在您的示例中,黑色圆圈周围的黑色圆圈必须是透明的):

import UIKit

class ViewController: UIViewController {

    fileprivate let imageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(imageView)
        imageView.clipsToBounds = true
        imageView.translatesAutoresizingMaskIntoConstraints = false
        let cons = [
            imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            imageView.heightAnchor.constraint(equalToConstant: 130),
            imageView.widthAnchor.constraint(equalToConstant: 300),
            ]
        NSLayoutConstraint.activate(cons)

        setup(image: #imageLiteral(resourceName: "image"), withMask: #imageLiteral(resourceName: "masking"))
    }

    fileprivate func setup(image: UIImage, withMask maskImage: UIImage) {
        imageView.superview?.layoutIfNeeded()
        imageView.image = maskImage
        let slicedMask = captureView(imageView: imageView)
        imageView.image = image
        let mask = CALayer()
        mask.contents = slicedMask.cgImage
        mask.frame = imageView.bounds
        imageView.layer.mask = mask
    }

    func captureView(imageView: UIImageView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, UIScreen.main.scale)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        imageView.layer.render(in: context)
        let img: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return img
    }
}

我在这里处理切片非常“hacky”:首先我在imageView中渲染掩码以将其切片,然后我拍摄渲染切片蒙版的“屏幕截图”,并使用屏幕截图作为蒙版。

请记住,mask.frame = imageView.bounds必须正确设置框架,因此在那时应该完成布局。如果稍后的图像布局发生变化,则必须再次设置遮罩。 mask.frame总是必须适合imageView.bounds(所以如果布局随时间变化,布局改变后重新设置图像)。

© www.soinside.com 2019 - 2024. All rights reserved.