2017-04-14 99 views
0

我试图让橡皮擦,我写了这个:橡皮擦工具为iOS应用

class EraserTool: Tool { 
    var context: CGContext? 

    fileprivate unowned let delegate: ToolDelegate 
    fileprivate unowned let imageView: UIImageView 

    fileprivate var currentPoint = CGPoint() 

    required init(imageView: UIImageView, delegate: ToolDelegate) { 
     self.delegate = delegate 
     self.imageView = imageView 
    } 

    func toucheBegin(at point: CGPoint) { 
     guard let image = imageView.image else { 
      printErr("can't erase, image nil") 

      return 
     } 

     UIGraphicsBeginImageContext(image.size) 
     guard let context = UIGraphicsGetCurrentContext() else { 
      printErr("can't get current context") 

      return 
     } 
     context.setBlendMode(.clear) 
     context.setLineCap(.round) 
     context.setLineWidth(CGFloat(delegate.toolWidthPercent)/imageView.imageScale * 100) 
     self.context = context 

     delegate.saveImageBeforeEditing() 

     currentPoint = point 
    } 

    func toucheMoved(to point: CGPoint) { 
     guard let context = context else { 
      printErr("no context") 
      return 
     } 

     imageView.erase(from: currentPoint, to: point, context: context) 

     currentPoint = point 
    } 

    func toucheEnd(at point: CGPoint) { 
     guard let context = context else {return} 

     imageView.erase(from: currentPoint, to: point, context: context) 

     UIGraphicsEndImageContext() 
    } 
} 


extension UIImageView { 
    func erase(from startPoint: CGPoint, to endPoint: CGPoint, context: CGContext) { 
     guard let image = image else { 
      printErr("can't erase, image nil") 

      return 
     } 

     image.draw(at: CGPoint()) 

     context.beginPath() 

     context.move(to: startPoint) 
     context.addLine(to: endPoint) 

     context.strokePath() 

     self.image = UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 

它工作正常的小图像,但是当我运行了较大的图片 - 它处理速度很慢。难道我做错了什么?有什么方法可以提高效率吗?

回答

0

我可以建议你的唯一一件事 - 降低图像的质量/尺寸。这对我有效。

extension UIImage { 
    func resizedToScreenDimensionsCopy() -> UIImage? { 
     let screenScale = UIScreen.main.scale 

     let ratio = (size.width * size.height)/(UIScreen.main.bounds.width * screenScale * UIScreen.main.bounds.height * screenScale * 3) 

     if ratio < 1 { 
      return self 
     } 

     let newImageSize = CGSize(width: size.width/ratio, height: size.height/ratio) 

     UIGraphicsBeginImageContext(newImageSize) 
     defer { 
      UIGraphicsEndImageContext() 
     } 
     draw(in: CGRect(origin: CGPoint(), size: newImageSize)) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 
}