2016-05-04 10 views
0

Я пытаюсь нарисовать путь на изображении с высоким разрешением, это ничего сложного для iPhone, но если я добавлю тень на свой путь, все будет отставать. Он отстает только при работе с изображениями с определенным разрешением (2000 x 3000) даже меньше.

В Раскадровка соперничает являются:
Как редактировать изображения с высоким разрешением с помощью Core Graphics?

-Scroll View 
    -Image View 
    -Draw View 

Так у меня есть DrawingView на вершине ImageView, когда мне нужно сделать.
Таким образом, ImageView и DrawView (view.bounds.size) имеют то же разрешение, что и изображение (например, 2000 x 3000) (есть проблема).
Я рисую изображение с высоким разрешением.

Я непосредственно не вызывая drawRect: но только вызывая setNeedsDisplay() внутри touchesBegan() и touchesMoved() после выполнения некоторых операций (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 = высокое разрешение

Мне нужно установить разрешение высоты (я думаю), когда i renderInContext. Но как я могу изменить разрешение imageView сейчас?

ответ

1

Попробуйте уменьшить его, чтобы пользователь мог нарисовать (не имеет большого значения на небольших экранах iPhone для удобства пользователей), а затем примените изменения к изображению с высоким разрешением.

Чтобы уменьшить массу изображений, либо использовать UIImagePNGRepresentation, которые могут сделать ваш образ существенно меньше, или (если вы все еще возникают проблемы с памятью), попробуйте использовать методы в this tutorial и this answer, чтобы сделать его еще меньше.

Затем вы можете получить содержимое того, что они нарисовали, и применить его к изображению с высоким разрешением.

Кроме того, обратите внимание на высокие разрешения методов оптимизации с помощью Apple: https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreensInViews/SupportingHiResScreensInViews.html

+0

Спасибо за ответ, я проверю пятницу. Смогу ли я применить содержимое моего рисунка от маленького разрешения до более высокого? – Danny182

+0

Если ваш drawView отделен от вашего изображения, вы можете привлечь пользователя, а затем применить то, что они нарисовали к изображению с высоким разрешением. Это не имеет значения для изображения с низким разрешением, если это просто на фоне их рисования. – brimstone

+0

У меня возникли проблемы с применением пути к изображению с высоким разрешением. Я обновил ответ – Danny182