如何创建浮雕或阴影使用核芯显卡的效果(指油漆)(How to create embossed or

2019-09-18 09:45发布

我有问题,实现我的画中“浮雕/阴影效应”。 手指画功能目前工作正常与我的自定义UIView以下是我drawRect方法的代码:

编辑代码的所有方法:

- (void)drawRect:(CGRect)rect
{
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1);

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self.layer renderInContext:context];

    CGContextMoveToPoint(context, mid1.x, mid1.y);
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.lineWidth);
    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
    CGContextSaveGState(context);

    // for shadow  effects
    CGContextSetShadowWithColor(context, CGSizeMake(0, 2),3, self.lineColor.CGColor);
    CGContextStrokePath(context);
    [super drawRect:rect];
}

CGPoint midPoint(CGPoint p1, CGPoint p2)
{
    return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5);
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];

    previousPoint1 = [touch previousLocationInView:self];
    previousPoint2 = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

    [self touchesMoved:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch  = [touches anyObject];

    previousPoint2  = previousPoint1;
    previousPoint1  = [touch previousLocationInView:self];
    currentPoint    = [touch locationInView:self];


    // calculate mid point
    CGPoint mid1    = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2    = midPoint(currentPoint, previousPoint1);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
    CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
    CGRect bounds = CGPathGetBoundingBox(path);
    CGPathRelease(path);

    CGRect drawBox = bounds;

    //Pad our values so the bounding box respects our line width
    drawBox.origin.x        -= self.lineWidth * 2;
    drawBox.origin.y        -= self.lineWidth * 2;
    drawBox.size.width      += self.lineWidth * 4;
    drawBox.size.height     += self.lineWidth * 4;

    UIGraphicsBeginImageContext(drawBox.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    curImage = UIGraphicsGetImageFromCurrentImageContext();
    [curImage retain];
    UIGraphicsEndImageContext();



   [self setNeedsDisplayInRect:drawBox];

}

当我已经实现这个我越来越有点点点漆效果...

见下文图像(不具有任何阴影或浮雕效果)。 如果您对如何添加这些效果的任何想法,请给我一些建议。 我该如何解决?

Answer 1:

看来,您正在创建数百个,甚至数千个不同的路径,一个在每个drawRect中。 你使用这些拉平了[self.layer renderInContext]但我不认为这是去了解它的好方法。 相反,我觉得你想要做的是创造一个UIBezierPath跟踪手指,追加路径是和绘制UIBezierPath到屏幕上。 如果创建两层(或意见),你可以设置一个顶部(透明)上的“画”。 当用户提起他们的手指,你再渲染整个UIBezierPath到第二层(与之前绘制的数据一起),并创建一个新的UIBezierPath画出下手指跟踪。 这样,你只更新一个层(最上面的一个),当你跟踪一个人的手指。 这将有助于防止设备放缓绘制了太多的路径。

虽然,我会说,你目前的方法并产生一个很酷的“3D”的效果。



Answer 2:

我不知道压花,但如果你想要的是一个阴影应用到逐步更新图纸,然后一个不错的方法是使用CALayers(链接到一个教程) 。 基本上,您的进步绘图将更新的透明图像(没有试图绘制该图像中的任何阴影)并且该图像将被配置为通过其的CALayer阴影显示。



Answer 3:

阴影笼罩在边界创建和你画线的小片段,这将创建这个效果。 您需要一次创建一个路径,然后中风它。 此代码可以帮助你:)

for (int i=0; i<[currentPath count]; i++) 
{
    CGPoint mid1 = [[self midPoint:[currentPath objectAtIndex:i+1]  :[currentPath objectAtIndex:i]] CGPointValue]; 
    CGPoint mid2 = [[self midPoint:[currentPath objectAtIndex:i+2] :[currentPath objectAtIndex:i+1]] CGPointValue];
    CGContextMoveToPoint(context, mid1.x, mid1.y);
    CGContextAddQuadCurveToPoint(context, [[currentPath objectAtIndex:i+1] CGPointValue].x, [[currentPath objectAtIndex:i+1] CGPointValue].y, mid2.x, mid2.y); 
    CGContextSetShadow(context, CGSizeMake(-2, -2), 3);

    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetStrokeColorWithColor(context,[color CGColor]);              
    CGContextSetLineWidth(context, linewidth);              

    i+=2;
}
CGContextStrokePath(context);

尝试这种方式。这可能解决解决您的问题。首先创建乌尔路径,它是完全建立后,中风它。 出现这种情况,因为在每一个细小的线,你中风,因此阴影创造就其边界点,让你获得这种效果。



文章来源: How to create embossed or shadow effects using Core Graphics (for finger paint)