我正在尝试在运行时更改图像的颜色。我在SO上看到了几个答案,但是它们都改变了背景颜色而不是前景,这就是我要尝试的方法。我已将代码基于另一个SO thread

这是我的代码:

@implementation UIImage (Coloring)

-(UIImage*) imageWithColorOverlay:(UIColor*)color
{
    //create context
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // drawingcode
    //bg
    CGRect rect = CGRectMake(0.0, 0.0, self.size.width, self.size.height);

    [self drawInRect:rect];

    //fg
    CGContextSetBlendMode(context, kCGBlendModeMultiply);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //end
    return image;
}

@end

到目前为止的结果是:

从左到右:
  • 不混合,仅常规资产。灰色bg来自imageviews后面的UIView,图像的bg是透明的。
  • 乘以kCGBlendModeMultiply
  • kCGBlendModeColorBurn进行彩色刻录

  • 是否有一个CGBlendMode可实现替换前景色?另外,是否可以同时替换前景色(白色)和阴影(黑色)?

    最佳答案

    弄乱了不同的混合选项后,此代码成功了。唯一需要注意的是,阴影中显示了红色,它在技术上不是正确的,但它的封闭感很强。

    @implementation UIImage (Coloring)
    
    -(UIImage*) imageWithColorOverlay:(UIColor*)color
    {
    //create context
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //drawingcode
    //bg
    CGRect rect = CGRectMake(0.0, 0.0, self.size.width, self.size.height);
    
    [self drawInRect:rect];
    
    //fg
    CGContextSetBlendMode(context, kCGBlendModeMultiply);
    
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    
    //mask
    [self drawInRect:rect blendMode:kCGBlendModeDestinationIn alpha:1.0];
    
    //end
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
    }
    

    关于ios - 使用混合图像着色/遮盖前景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18006520/

    10-12 04:41