2016-01-17 3 views
1

я получаю точку с сенсорным экраном, а также масштабировать точку, то я поставил точку в UIBezierPath,IOS: UIImage создатель UIBezierPath не сглаживать

это мой код

let bezierPath = UIBezierPath() 

for var i:Int = 0 ; i < newPoints.count ; i++ { 
    var indexCount = 0 
    let point = newPoints[i][j] 
    if point.count > 0{ 
     let newPointX = point[0] - originRectX // reset the point start with CGPointZero 
     let newPointY = point[1] - originRectY 
     let scalePointX = newPointX * heightScale //scale the point with heightScale 0.25 
     let scalePointY = newPointY * heightScale 
     let scalePoint = CGPointMake(scalePointX, scalePointY) 
     if indexCount == 0 { 
     bezierPath.moveToPoint(scalePoint) 
     }else{ 
     bezierPath.addLineToPoint(scalePoint) 
     } 
     indexCount++ 
    } 
} 

я преобразовать путь к UIImage

var tempImage = UIImage() 
UIGraphicsBeginImageContextWithOptions(size, false, 1) 
stokeColor.setStroke() 
bezierPath.lineWidth = lineWidth 
bezierPath.lineCapStyle = CGLineCap.Round 
bezierPath.lineJoinStyle = CGLineJoin.Round 
bezierPath.stroke() 
tempImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

тогда я рисую UIImage в экране

let context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context) 
let rect = CGRect(x: drawObj.points![0].x,y: drawObj.points![0].y,width: drawObj.image.size.width,height: drawObj.image.size.height) 
drawObj.image?.drawInRect(rect) 
CGContextRotateCTM(context,CGFloat(Double(drawObj.angle!)*M_PI/180)) 
CGContextRestoreGState(context) 

это эффект

enter image description here

Вы можете найти не сглаживать

+1

В то время как Курт ответил на вопрос о пикселизации, вы также можете найти отдельную проблему, которая 'addLineToPoint' может в конечном итоге привести к тому, что путь будет выглядеть как ряд сегментов линии, а не плавные кривые. По крайней мере, в iOS 9 вы можете использовать объединенные и прогностические точки для улучшения количества точек, захваченных на высокопроизводительных устройствах. Кроме того, вы можете применять алгоритмы сглаживания, показанные здесь: http://stackoverflow.com/questions/34579957/drawing-class-drawing-straight-lines-instead-of-curved-lines/34583708#34583708. – Rob

ответ

2

Прочитайте documentation для функций, которые вы звоните.

UIGraphicsBeginImageContextWithOptions(size, false, 1) 

Третий аргумент: scale. Вы проходите в 1, это шкала для 1x дисплея, такого как оригинальный iPhone. В 2016 году вы почти наверняка используете устройство с основным экраном 2x или 3x. Самое простое решение, чтобы изменить аргумент 0, который будет автоматически использовать шкалу основного экрана:

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

Кроме того, в то время как мы здесь, эта линия не делает эффективно ничего:

CGContextRotateCTM(context,CGFloat(Double(drawObj.angle!)*M_PI/180)) 

Если вы хотите, чтобы он применился к рисунку изображения, вам нужно позвонить ему сначала, до, вы вызываете drawObj.image?.drawInRect(rect).

Смежные вопросы