如何在图像周围添加笔划?

时间:2015-09-27 23:36:30

标签: ios core-graphics

问题

我有CGImageRef张图片。它实际上是一个将用作蒙版的图像。所以," alpha层"这是我真正关心的。我想"加厚"图像的不透明部分,好像我会在不透明部分周围添加笔划。怎么做?

更多上下文

我有一张图像(CGImageRef):

enter image description here

它是由

创建的
    mask = CGBitmapContextCreateImage(context);

我用它作为面具。掩码下的UIView是相同的文本。问题是掩码覆盖了下面的文字。参见:

enter image description here

更多代码

此代码位于UILabel子类中。

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Draw text normally
    [super drawTextInRect:rect];

    if (self.alternativeTextColor) {
        CGImageRef mask = NULL;

        // Create a mask from the text
        mask = CGBitmapContextCreateImage(context);

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, 0, self.frame.size.height);
        CGContextScaleCTM(context, 1.0, (CGFloat) -1.0);

        // Clip the current context to our mask
        CGContextClipToMask(context, rect, mask);

        // Set fill color
        CGContextSetFillColorWithColor(context, [self.alternativeTextColor CGColor]);

        // Path from mask
        CGPathRef path;

        if (CGRectIsEmpty(self.maskFrame)) {
            path = CGPathCreateMutable();
        } else {
            UIBezierPath *roundRectBezierPath = [UIBezierPath bezierPathWithRoundedRect:self.maskFrame
                                                                           cornerRadius:self.maskCornerRadius];
            path = CGPathCreateCopy([roundRectBezierPath CGPath]);
        }

        CGContextAddPath(context, path);

        // Fill the path
        CGContextFillPath(context);
        CFRelease(path);

        // Clean up
        CGContextRestoreGState(context);
        CGImageRelease(mask);
    }
}

项目链接

https://github.com/colasjojo/Test-NYSegmentedControl

1 个答案:

答案 0 :(得分:1)

如果你试图剪辑到文本,我建议不要通过中间位图来做,而是剪切到实际文本的路径,如下面SVGgh的GHText类的片段:

            CGContextSaveGState(quartzContext);
            CGContextSetTextDrawingMode(quartzContext, kCGTextStrokeClip);
            CGContextSetLineWidth(quartzContext, strokeWidthToUse);
            ... Draw Text here ....
             CGContextReplacePathWithStrokedPath(quartzContext);
            CGContextClip(quartzContext);
            ... Do clipped drawing here ...
            CGContextSetTextDrawingMode(quartzContext, kCGTextFill);
            CGContextRestoreGState(quartzContext);

这不是回答你的问题,但它可能是你应该做的事情。使用CGContextSetTextDrawingMode来获得你想要的效果。