我正在尝试在高分辨率图像上绘制一条路径,这对iPhone来说并不复杂,但如果我在路径上添加阴影,一切都会滞后。它仅在我处理具有一定分辨率(2000 x 3000)甚至更小的图像时才会滞后。
故事板依旧是:
-Scroll View
-Image View
-Draw View
所以当我需要绘制时,我在ImageView的顶部有DrawingView
所以ImageView和DrawView(view.bounds.size
)具有与图像相同的分辨率(例如2000 x 3000)(存在问题)。
我正在绘制一个高分辨率的视图。
我没有直接调用drawRect:
,只是在执行某些操作后调用setNeedsDisplay()
和touchesBegan()
内的touchesMoved()
{{1} },path.moveToPoint
,数组操作)并为我的数组添加点。
在path.addCurveToPoint
我基本上有:
drawRect:
我的路径是override func drawRect(rect: CGRect) {
print(self.bounds.size)
UIColor.greenColor().setStroke()
path.lineCapStyle = .Round
path.lineJoinStyle = .Round
path.lineWidth = 60.0
context = UIGraphicsGetCurrentContext()!
CGContextAddPath(context, path.CGPath)
CGContextSetShadowWithColor(context, CGSizeZero, 14.0, UIColor.whiteColor().CGColor) // <-- with this shadow it lags a lot.
path.stroke()
}
。
有什么提高速度的想法?
更新
我跟着@brimstone说的话。我现在拥有较低分辨率的ImageView,但必须将我绘制的路径应用于高分辨率图像。
(我正试图用用户绘制的路径裁剪图像)
在这段代码中,我已经有了封闭的路径:
UIBezierPath()
let layer = CAShapeLayer()
layer.path = path.CGPath
self.imageToEditView.layer.mask = layer
UIGraphicsBeginImageContext(self.imageEdited.size)
self.imageToEditView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let croppedCGImage = CGImageCreateWithImageInRect(image.CGImage!, CGPathGetBoundingBox(path.CGPath))
let croppedImage = UIImage(CGImage: croppedCGImage!)
self.imageToEditView.image = croppedImage
self.imageToEditView.layer.mask = nil
=低分辨率
imageToEditView.bounds.size
=高分辨率
当我imageEdited.size
时,我需要设置高分辨率(我认为)。但是我怎样才能改变imageView的分辨率呢?
答案 0 :(得分:1)
尝试缩小尺寸以供用户绘制(不会在小型iPhone屏幕上为用户体验带来巨大差异),然后将编辑应用于高分辨率图像。
要缩小图片尺寸,请使用UIImagePNGRepresentation
,这可能会使图片显得更小,或者(如果您仍然遇到内存问题),请尝试使用this tutorial和{{3}中的技巧使它更小。
然后,您可以获取他们绘制的内容并将其应用于高分辨率图像。
或者,看看Apple的高分辨率优化技术:this answer