更新:这是使用以下代码的Swift UIColor扩展的要点。
如果您有灰度图像,并且希望白色成为着色色,kCGBlendModeMultiply
则是一种方法。使用这种方法,您不能使突出显示的颜色比着色的颜色浅。
相反,如果你有一张非灰度图像,或者你有亮点和阴影应保留,混合模式kCGBlendModeColor
是要走的路。由于图像的亮度得以保留,因此白色将保持白色,而黑色将保持黑色。此模式仅用于着色-与Photoshop的Color
图层混合模式相同(免责声明:结果可能会略有不同)。
请注意,无论是在iOS中还是在Photoshop中,着色alpha像素均无法正常工作-半透明的黑色像素不会保持黑色。我更新了以下答案来解决该问题,但花了很长时间才找到答案。
您也可以使用一种混合模式kCGBlendModeSourceIn/DestinationIn
代替CGContextClipToMask
。
如果要创建一个UIImage
,下面的每个代码段都可以被以下代码包围:
UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, myIconImage.scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, myIconImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGRect rect = CGRectMake(0, 0, myIconImage.size.width, myIconImage.size.height);
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
因此,这是使用着色透明图像的代码kCGBlendModeColor
:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
如果您的图像没有半透明像素,则也可以使用kCGBlendModeLuminosity
以下方法:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
如果您不关心亮度,因为您只获得了带有Alpha通道的图像,该图像应使用颜色进行着色,则可以以更有效的方式进行操作:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
或相反:
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
玩得开心!