如何创建要在运行时着色的模板图像

Chr*_*ore 8 image-processing objective-c uiimage ios gpuimage

我有一个几乎是平面颜色的图像.它附着但是纯白色,所以你不能轻易看到它.

样本图片 我希望能够在运行时动态地为该图像着色,但我需要在iOS 6中不使用UIImageRenderingModeAlwaysTemplate.

图像将全部以纯白色开始,具有圆角的小渐变.

到目前为止,我最好的尝试是在UIImage上使用GPUImage和一个类别

@implementation UIImage (BPAdditions)

- (UIImage *)imageWithColor:(UIColor *)color
{

    GPUImageRGBFilter *stillImageFilter = [[GPUImageRGBFilter alloc] init];
    CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
    stillImageFilter.red = red;
    stillImageFilter.green = green;
    stillImageFilter.blue = blue;
    GPUImageChromaKeyFilter *stillImageFilter2 = [[GPUImageChromaKeyFilter alloc] init];
    [stillImageFilter2 setColorToReplaceRed:0 green:0 blue:0];
    stillImageFilter2.thresholdSensitivity = 0.2;
    stillImageFilter2.smoothing = 0;
    UIImage *img = [stillImageFilter imageByFilteringImage:self];

    return [stillImageFilter2 imageByFilteringImage: img];
}
Run Code Online (Sandbox Code Playgroud)

这将是理想的,除非我使用RGB滤镜时将透明背景变为黑色.然后使用色度滤光片将其去除根据使用的颜色具有不同的质量.

目标颜色有可能是黑色,在这种情况下,该解决方案将完全失败.

Mar*_*dal 18

不确定我是否理解你想要实现的目标,但是你想为基本图像添加一个简单的颜色色调吗?如果是这样,您可以在UIImage上使用以下类别实现此目的:

- (UIImage *)tintWithColor:(UIColor *)tintColor {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
    CGRect drawRect = CGRectMake(0, 0, self.size.width, self.size.height);
    [self drawInRect:drawRect];
    [tintColor set];
    UIRectFillUsingBlendMode(drawRect, kCGBlendModeSourceAtop);
    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return tintedImage;
}
Run Code Online (Sandbox Code Playgroud)

- 更新:Swift 2版本 -

extension UIImage {

    func tintWithColor(color:UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.mainScreen().scale)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height)
        self.drawInRect(rect)
        color.setFill()
        UIRectFillUsingBlendMode(rect, CGBlendMode.SourceAtop)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

}
Run Code Online (Sandbox Code Playgroud)