【发布时间】:2021-01-12 11:27:45
【问题描述】:
在到处搜索之后,我发现没有任何特定的来源可用于使用 bezierPath 删除背景。基本上我正在尝试实现类似图像剪切的功能(您可以检查 PicsArt >> Image editor >> CutOut)。在此用户可以在图像上绘制任何形状,并且可以突出显示选定区域并删除其余部分。
这是我用来在图像上画线的方法
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
}
}
}
为了剪切一个选定的区域,我尝试使用CGImage 的cropping(to:) 方法。但它只是清除整个图像不起作用。您可以在下面查看我的内容
我不确定我这样做是否正确。我也对其他方式持开放态度。
【问题讨论】:
标签: ios swift image-processing uiimageview uiimage