Stroke a CGContext path using an image in CoreGraphics

风格不统一 提交于 2019-12-10 00:28:34

问题


Im trying to draw line by stroking an image to have brush like effect via CoreGraphics framework.

I followed this post and this post and tried to draw from the touchesMoved method and the code sample'll be of the form

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;

By doing so, I got error msgs,

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

So, I put on the code related for context and the modified code is

    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();

But when I run and try to draw on touch move, nothing is drawn. I cant get what went wrong. Can someone point me my mistake? Im still spending much time in sorting this out, but couldn't do it yet now. Any timely help is much appreciated. Thanks.


回答1:


I see, your touchesMoved should look like this.

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;
}


来源:https://stackoverflow.com/questions/11390079/stroke-a-cgcontext-path-using-an-image-in-coregraphics

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!