Swift 圖片 涂鴉 最后合成

  1. 創(chuàng)建涂鴉效果層(用戶操作層,把用戶的操作軌跡顯示出來)
class GraffitiView: UIView {
    
    class GraffitiLine: UIBezierPath {
        var lineColor: UIColor = .red
        override init() {
            super.init()
            lineCapStyle = .round
            lineJoinStyle = .round
            lineWidth = 5
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    private var lineArray = [GraffitiLine]()
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = .clear
        
        self.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(addLineAction(pan:))))
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func draw(_ rect: CGRect) {
        for line in lineArray {
            line.lineColor.setStroke()
            line.stroke()
        }
        
    }
    
    func clear() {
        lineArray.removeAll()
        setNeedsDisplay()
    }
    
    // MARK: - actions
    @objc func addLineAction(pan: UIPanGestureRecognizer) {
        
        switch pan.state {
        case .began:
            let path = GraffitiLine()
            path.move(to: pan.location(in: self))
            lineArray.append(path)
            
        case .changed:
            lineArray.last?.addLine(to: pan.location(in: self))
            setNeedsDisplay()
        default:
            print("")
        }
    }
}
  1. 使用GraffitiView 時(shí) 大小要與圖片展示的大小一致,保證涂鴉范圍與圖片區(qū)域一致
    推薦使用方法,直接放在圖片上
graffitiMaskView.frame = imgView.bounds
imgView.isUserInteractionEnabled = true
imgView.addSubview(graffitiMaskView)
  1. 最后涂鴉完成后,進(jìn)行圖片合成
// 提取涂鴉層的圖片
var graffitiImage: UIImage? = nil
UIGraphicsBeginImageContextWithOptions(graffitiMaskView.bounds.size, false, UIScreen.main.scale)
if let context = UIGraphicsGetCurrentContext() {
    graffitiMaskView.layer.render(in: context)
    graffitiImage = UIGraphicsGetImageFromCurrentImageContext()
}
UIGraphicsEndImageContext()
// 合成原始圖片與涂鴉圖片
UIGraphicsBeginImageContextWithOptions(clipSize, false, 1)
image?.draw(at: .zero)
graffitiImage?.draw(in: CGRect(origin: .zero, size: clipSize))
clippedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容