如何使用Core Graphics编辑高分辨率图像?

时间:2016-05-04 17:30:53

标签: swift core-graphics uibezierpath

我正在尝试在高分辨率图像上绘制一条路径,这对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的分辨率呢?

1 个答案:

答案 0 :(得分:1)

尝试缩小尺寸以供用户绘制(不会在小型iPhone屏幕上为用户体验带来巨大差异),然后将编辑应用于高分辨率图像。

要缩小图片尺寸,请使用UIImagePNGRepresentation,这可能会使图片显得更小,或者(如果您仍然遇到内存问题),请尝试使用this tutorial和{{3}中的技巧使它更小。

然后,您可以获取他们绘制的内容并将其应用于高分辨率图像。

或者,看看Apple的高分辨率优化技术:this answer