我正在使用此代码为 UIButton 子类的一些图像着色:
UIImage *img = [self imageForState:controlState];
// begin a new image context, to draw our colored image onto
UIGraphicsBeginImageContextWithOptions(img.size, NO, 0.0f);
// get a reference to that context we created
CGContextRef context = UIGraphicsGetCurrentContext();
// set the fill color
[self.buttonColor setFill];
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, img.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// set the blend mode to multiply, and the original image
CGContextSetBlendMode(context, kCGBlendModeScreen);
CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);
CGContextDrawImage(context, rect, img.CGImage);
// set a mask that matches the shape of the image, then draw the colored image
CGContextClipToMask(context, rect, img.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathFill);
// generate a new UIImage from the graphics context we drew onto
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return the colored image
[self setImage:coloredImg forState:controlState];
但是图像的边缘很粗糙。我尝试过使用屏幕、变亮和 plusLighter 混合模式,因为有些图像有我想保持白色的白色部分。我想要着色的唯一部分是黑色区域。我附上了原始按钮图像,并在它们被着色后。我不能让边缘看起来很好。当我将它们作为使用多重混合模式着色的白色图像时,它看起来好多了。但我想使用黑色,所以我可以使用一种方法来为有和没有白色的图像着色。我尝试了抗锯齿,这也没有帮助。看起来它只是没有抗锯齿。我与 Core Graphics 的合作还不够多,无法知道它是怎么回事。
编辑 这是原始PNG的样子:
它应该是这样的:
这就是它的样子:
尺寸不同,但您可以看到边缘质量差。