我正在尝试创建一个应用程序,我可以擦除用户从“相机胶卷”导入的图片背景。
所以我想在UIImage上手绘UIColor.clearColor。
所以我尝试使用Core Graphics来绘制我的UIImage
我最初尝试通过以下方式绘制线条:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first {
lastPoint = touch.locationInView(self)
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first {
var newPoint = touch.locationInView(self)
lines.append(Line(start: lastPoint, end: newPoint))
lastPoint = newPoint
self.setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
imageToSend.drawAtPoint(CGPointZero)
var context = UIGraphicsGetCurrentContext()
CGContextBeginPath(context)
for line in lines {
CGContextMoveToPoint(context, line.start.x, line.start.y)
CGContextAddLineToPoint(context, line.end.x, line.end.y)
}
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor) //tried with a red color here
CGContextSetLineWidth(context, 80.0)
CGContextSetLineCap(context, .Round)
}
问题在于它非常滞后。 调试会话(xCode)中的内存使用率以及CPU使用率非常高。
在iPhone 6s上运行应用程序。
那么有没有更好的方法来擦除Swift中的图片?
另一个问题是它创建了线条,我希望它更加流畅。但这是另一个问题
答案 0 :(得分:4)
我的假设是性能滞后是由频繁调用 drawRect 方法引起的 - 它在你的代码片段中做了非常大的工作 - 渲染图像。我们的想法是使用选择区域绘图视图覆盖包含图像的 UIImageView ,该图形在图像视图的顶部进行绘制。因此它应该允许区域绘图与图像绘制分开。因此,显着消耗资源操作(图像绘制)应该只执行一次。
我已实现此功能,您可以在此处查看我的示例应用:
https://github.com/melifaro-/CutImageSampleApp
<强>更新强>
一旦您拥有与图像对应的bezier路径,就可以轻松裁剪图像。你只需要:
let croppedCGImage = CGImageCreateWithImageInRect(image.CGImage!, CGPathGetPathBoundingBox(path.CGPath));
let croppedImage = UIImage(CGImage: croppedCGImage!)
我也推动了示例应用更改。希望它有所帮助。