使用CoreGraphics中的图像描绘CGContext路径

我试图通过抚摸图像来绘制线条,通过CoreGraphics框架刷效果。

我按照这篇文章和这篇文章 ,尝试从touchesMoved方法绘制,代码示例将是forms

 UITouch *touch = [touches anyObject]; CGPoint currentPoint = [touch locationInView:self.view]; UIImage *texture = [UIImage imageNamed:@"texture.png"]; CGPoint vector = CGPointMake(currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y); NSLog(@" vector %@", NSStringFromCGPoint(vector)); CGFloat distance = hypotf(vector.x, vector.y); vector.x /= distance; vector.y /= distance; for (CGFloat i = 0; i < distance; i += 1.0f) { CGPoint p = CGPointMake(lastPoint.x + i * vector.x, lastPoint.y + i * vector.y); [texture drawAtPoint:p blendMode:kCGBlendModeNormal alpha:1.0f]; NSLog(@"p %@", NSStringFromCGPoint(p)); } previousPoint = currentPoint; 

通过这样做,我得到错误消息,

 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextSaveGState: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextSetBlendMode: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextSetAlpha: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextTranslateCTM: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextScaleCTM: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextDrawImage: invalid context 0x0 Jul 9 11:51:27 mac1.local Smooth Line View[1035] : CGContextRestoreGState: invalid context 0x0 

所以,我把与上下文相关的代码和修改后的代码放在一起

  UITouch *touch = [touches anyObject]; currentPoint = [touch locationInView:self]; UIGraphicsBeginImageContext(self.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(context, kCGBlendModeNormal); CGContextSetAlpha(context, 1.0f); CGContextSaveGState(context); UIImage *texture = [UIImage imageNamed:@"textureImg.png"]; [texture drawAtPoint:currentPoint blendMode:kCGBlendModeNormal alpha:1.0f]; CGContextSetLineCap(context, kCGLineCapRound); CGContextSetLineWidth(context, 25.0); CGContextSetRGBStrokeColor(context, texture.CGColor); CGContextBeginPath(context); CGContextMoveToPoint(context, previousPoint.x, previousPoint.y); CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y); CGContextDrawPath(context, kCGPathFillStroke); UIGraphicsEndImageContext(); 

但是当我跑步并尝试在触摸移动时绘制时,没有任何东西被绘制出来。 我不知道出了什么问题。 有人能指出我的错误吗? 我仍然花了很多时间来解决这个问题,但现在还没有做到。 非常感谢任何及时的帮助。 谢谢。

我知道,你的touchesMoved看起来应该是这样的。

 BOOL touchSwiped = YES; UITouch *touch = [touches anyObject]; currentPoint = [touch locationInView:self.view]; currentPoint.y -= 685; //< //currentPoint.x = ???; <------ adjust the x and y points of the currentPoint if it is not on the exact point of drawing. UIGraphicsBeginImageContext(touchDraw.frame.size); [touchDraw.image drawInRect:CGRectMake(0, 0, touchDraw.frame.size.width, touchDraw.frame.size.height)]; CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); UIImage * textureColor = [UIImage imageNamed:@"brushImg.png"]; CGPoint vector = CGPointMake(currentPoint.x - previousPoint.x, currentPoint.y - previousPoint.y); CGFloat distance = hypotf(vector.x, vector.y); vector.x /= distance; vector.y /= distance; for (CGFloat i = 0; i < distance; i += 1.0f) { CGPoint p = CGPointMake(previousPoint.x + i * vector.x, previousPoint.y + i * vector.y); [textureColor drawAtPoint:p blendMode:blendMode alpha:0.5f]; } CGContextBeginPath(UIGraphicsGetCurrentContext()); CGContextStrokePath(UIGraphicsGetCurrentContext()); touchDraw.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); previousPoint = currentPoint; touchMoved++; if (touchMoved == 1) { touchMoved = 0; }