在Swift中删除图片的最佳方法是什么?

时间:2016-04-26 13:43:04

标签: swift core-graphics

我正在尝试创建一个应用程序,我可以擦除用户从“相机胶卷”导入的图片背景
所以我想在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中的图片?
另一个问题是它创建了线条,我希望它更加流畅。但这是另一个问题

1 个答案:

答案 0 :(得分:4)

我的假设是性能滞后是由频繁调用 drawRect 方法引起的 - 它在你的代码片段中做了非常大的工作 - 渲染图像。我们的想法是使用选择区域绘图视图覆盖包含图像的 UIImageView ,该图形在图像视图的顶部进行绘制。因此它应该允许区域绘图与图像绘制分开。因此,显着消耗资源操作(图像绘制)应该只执行一次。

我已实现此功能,您可以在此处查看我的示例应用:

https://github.com/melifaro-/CutImageSampleApp

enter image description here

<强>更新

一旦您拥有与图像对应的bezier路径,就可以轻松裁剪图像。你只需要:

let croppedCGImage =  CGImageCreateWithImageInRect(image.CGImage!, CGPathGetPathBoundingBox(path.CGPath));
let croppedImage = UIImage(CGImage: croppedCGImage!)  

我也推动了示例应用更改。希望它有所帮助。