+ (UIImage *)imageWithBorderForImage:(UIImage *)image
{
CGFloat radius = 5;
CGSize size = image.size;
radius = MIN(radius, .5 * MIN(size.width, size.height));
CGRect interiorRect = CGRectInset(CGRectMake(0, 0, size.width, size.height), radius, radius);
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGMutablePathRef borderPath = CGPathCreateMutable();
CGPathAddArc(borderPath, NULL, CGRectGetMinX(interiorRect), CGRectGetMinY(interiorRect), radius, 1.0*M_PI, 1.5*M_PI, NO);
CGPathAddArc(borderPath, NULL, CGRectGetMaxX(interiorRect), CGRectGetMinY(interiorRect), radius, 1.5*M_PI, 0.0*M_PI, NO);
CGPathAddArc(borderPath, NULL, CGRectGetMaxX(interiorRect), CGRectGetMaxY(interiorRect), radius, 0.0*M_PI, 0.5*M_PI, NO);
CGPathAddArc(borderPath, NULL, CGRectGetMinX(interiorRect), CGRectGetMaxY(interiorRect), radius, 0.5*M_PI, 1.0*M_PI, NO);
CGContextBeginPath(context);
CGContextAddPath(context, borderPath);
CGContextClosePath(context);
CGContextClip(context);
[image drawAtPoint:CGPointMake(0,0)];
CGContextBeginPath(context);
CGContextAddPath(context, borderPath);
CGContextClosePath(context);
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1.0);
CGContextSetLineWidth(context, 1.0);
CGContextStrokePath(context);
CGPathRelease(borderPath);
UIImage *borderedImage = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(context);
UIGraphicsEndImageContext();
return borderedImage;
}
this question
.
一个问题是,由于抗锯齿,边界实际上是2px宽(尽管1px落在剪辑区域之外)。理想情况下,边框的阿尔法值约为0.5,但由于抗锯齿技术为2个像素中的每一个像素都提供了一些阿尔法值,我将其设置为1,结果大致正确。如果我禁用抗锯齿,那么角就不会完全变圆:/