After searching everywhere I found there is nothing specific source available to remove the background using bezierPath. Basically I am trying to achieve a similar feature like image cutout (You can check PicsArt >> Image editor >> CutOut). In this where user can draw any shape on the image and selected area can be highlighted and the rest of the part is removed.
Here is what I am using to draw the line on image
class DrawingImageView: UIImageView {
var path = UIBezierPath()
var previousTouchPoint = CGPoint.zero
var shapeLayer = CAShapeLayer()
var isClear: Bool = false {
didSet {
updateView()
}
}
override func awakeFromNib() {
super.awakeFromNib()
setupView()
}
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func updateView() {
self.shapeLayer.shadowOffset = .init(width: 1, height: 1)
self.shapeLayer.shadowColor = UIColor.black.cgColor
self.shapeLayer.shadowOpacity = 1
self.shapeLayer.lineWidth = 20
self.shapeLayer.lineCap = .round
self.shapeLayer.strokeColor = isClear ? UIColor.clear.cgColor : UIColor.blue.cgColor
self.shapeLayer.opacity = 0.3
self.isUserInteractionEnabled = true
}
func setupView() {
self.layer.addSublayer(shapeLayer)
updateView()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let location = touches.first?.location(in: self){
previousTouchPoint = location
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
if let location = touches.first?.location(in: self){
path.move(to: location)
path.addLine(to: previousTouchPoint)
previousTouchPoint = location
shapeLayer.path = path.cgPath
}
}
}
To cut out a selected area I tried using cropping(to:)
method of CGImage
. but it's not working just clearing the entire image. You can check my out below
Resultant image after using cropping(to:)
I am not sure if I am doing this correctly. I am open to other ways also.