【问题标题】:Stroke a CGContext path using an image in CoreGraphics使用 CoreGraphics 中的图像绘制 CGContext 路径
【发布时间】:2012-07-09 06:33:17
【问题描述】:

我试图通过CoreGraphics 框架通过抚摸图像以产生类似刷子的效果来画线。

我关注this postthis post 并尝试从touchesMoved 方法中提取,代码示例的格式为

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] <Error>: CGContextSaveGState: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextSetBlendMode: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextSetAlpha: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextTranslateCTM: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextScaleCTM: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextDrawImage: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: 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();

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

【问题讨论】:

    标签: ios core-graphics cgcontext quartz-core


    【解决方案1】:

    我明白了,你的 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;
    }
    

    【讨论】:

    • 您好 SeongHo,感谢您的回复。我没有在我的代码中使用任何 imageViews。希望touchDraw.image= UIGraphicsGetImageFromCurrentImageContext(); 暗示有一些imageView。我不明白touchDraw 是什么实例。你能告诉我为什么使用touchDraw吗?
    • 我在 imageView 上绘图,以便我可以删除或擦除它的内容。像这样,touchDraw.image = nil;双击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多