如何使用 Core Graphics 编辑高分辨率图像?
How to edit high resolution images with Core Graphics?
我正在尝试在高分辨率图像上绘制一条路径,这对于 iPhone 来说并不复杂,但是如果我在我的路径上添加阴影,一切都会滞后。仅当我处理具有特定分辨率 (2000 x 3000) 甚至更小的图像时它才会滞后。
故事板 视图是:
-Scroll View
-Image View
-Draw View
所以当我需要绘制时,我将 DrawingView 放在 ImageView 之上。
因此 ImageView 和 DrawView (view.bounds.size
) 具有与图像相同的分辨率(例如 2000 x 3000)(有问题)。
我正在绘制高分辨率的视图。
我不是直接调用drawRect:
而是在touchesBegan()
和touchesMoved()
内部做一些操作后才调用setNeedsDisplay()
(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()
}
我的路径是 UIBezierPath()
.
有什么提高速度的想法吗?
更新:
我听从了@brimstone 所说的。我现在有分辨率较低的 ImageView,但必须将我绘制的路径应用于高分辨率图像。
(我正在尝试使用用户绘制的路径手动裁剪图像)
在这段代码中,我已经得到了我的封闭路径:
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
= 高分辨率
当我 renderInContext
时,我需要设置高分辨率(我认为)。但是现在如何更改 imageView 的分辨率?
尝试将其缩小以供用户绘制(在小 iPhone 屏幕上不会对用户体验产生巨大影响),然后将编辑应用到高分辨率图像。
要缩小图像,请使用 UIImagePNGRepresentation
,这可能会使您的图像足够小,或者(如果您仍然有内存问题),请尝试使用 this tutorial and this answer 中的技术使其均匀更小。
然后,您可以将他们绘制的内容应用到高分辨率图像中。
或者,查看 Apple 的高分辨率优化技术:https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreensInViews/SupportingHiResScreensInViews.html
我正在尝试在高分辨率图像上绘制一条路径,这对于 iPhone 来说并不复杂,但是如果我在我的路径上添加阴影,一切都会滞后。仅当我处理具有特定分辨率 (2000 x 3000) 甚至更小的图像时它才会滞后。
故事板 视图是:
-Scroll View
-Image View
-Draw View
所以当我需要绘制时,我将 DrawingView 放在 ImageView 之上。
因此 ImageView 和 DrawView (view.bounds.size
) 具有与图像相同的分辨率(例如 2000 x 3000)(有问题)。
我正在绘制高分辨率的视图。
我不是直接调用drawRect:
而是在touchesBegan()
和touchesMoved()
内部做一些操作后才调用setNeedsDisplay()
(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()
}
我的路径是 UIBezierPath()
.
有什么提高速度的想法吗?
更新:
我听从了@brimstone 所说的。我现在有分辨率较低的 ImageView,但必须将我绘制的路径应用于高分辨率图像。
(我正在尝试使用用户绘制的路径手动裁剪图像)
在这段代码中,我已经得到了我的封闭路径:
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
= 高分辨率
当我 renderInContext
时,我需要设置高分辨率(我认为)。但是现在如何更改 imageView 的分辨率?
尝试将其缩小以供用户绘制(在小 iPhone 屏幕上不会对用户体验产生巨大影响),然后将编辑应用到高分辨率图像。
要缩小图像,请使用 UIImagePNGRepresentation
,这可能会使您的图像足够小,或者(如果您仍然有内存问题),请尝试使用 this tutorial and this answer 中的技术使其均匀更小。
然后,您可以将他们绘制的内容应用到高分辨率图像中。
或者,查看 Apple 的高分辨率优化技术:https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreensInViews/SupportingHiResScreensInViews.html