在 Swift 中擦除图片的最佳方法?
Best way to erase on a picture in Swift?
我正在尝试制作一个应用程序,我可以在其中擦除用户从 "Camera roll"[=26 导入的图片 中的背景=].
所以我想在 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)
}
问题是它很慢。Debug Session(xCode)中的内存使用量非常大high 以及 CPU 用法。
运行 应用 iPhone 6 秒。
那么在Swift的图片上有没有更好的擦除方法呢?
另一个问题是它会产生线条,我希望它更平滑。但这是另一个问题
我的假设是性能滞后是由频繁调用 drawRect 方法引起的 - 它在您的代码片段 - 渲染图像中确实做了很多工作。这个想法是用选择区域绘图视图覆盖包含图像的 UIImageView,它在图像视图的顶部进行绘图。所以它应该允许将区域绘图与图像绘图分开。因此,资源消耗很大的操作(图像绘制)应该只执行一次。
我已经实现了这个,你可以在这里查看我的示例应用程序:
https://github.com/melifaro-/CutImageSampleApp
更新
有了与图像对应的贝塞尔曲线路径后,裁剪图像就很容易了。您只需要:
let croppedCGImage = CGImageCreateWithImageInRect(image.CGImage!, CGPathGetPathBoundingBox(path.CGPath));
let croppedImage = UIImage(CGImage: croppedCGImage!)
我也推送了示例应用程序更改。希望对你有帮助。
我正在尝试制作一个应用程序,我可以在其中擦除用户从 "Camera roll"[=26 导入的图片 中的背景=].
所以我想在 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)
}
问题是它很慢。Debug Session(xCode)中的内存使用量非常大high 以及 CPU 用法。
运行 应用 iPhone 6 秒。
那么在Swift的图片上有没有更好的擦除方法呢?
另一个问题是它会产生线条,我希望它更平滑。但这是另一个问题
我的假设是性能滞后是由频繁调用 drawRect 方法引起的 - 它在您的代码片段 - 渲染图像中确实做了很多工作。这个想法是用选择区域绘图视图覆盖包含图像的 UIImageView,它在图像视图的顶部进行绘图。所以它应该允许将区域绘图与图像绘图分开。因此,资源消耗很大的操作(图像绘制)应该只执行一次。
我已经实现了这个,你可以在这里查看我的示例应用程序:
https://github.com/melifaro-/CutImageSampleApp
更新
有了与图像对应的贝塞尔曲线路径后,裁剪图像就很容易了。您只需要:
let croppedCGImage = CGImageCreateWithImageInRect(image.CGImage!, CGPathGetPathBoundingBox(path.CGPath));
let croppedImage = UIImage(CGImage: croppedCGImage!)
我也推送了示例应用程序更改。希望对你有帮助。