2013-08-01 54 views
1

我試圖在運行時更改圖像的顏色。我已經看到了幾個關於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 

這是導致迄今:

picture with three snapshots from the simulator

從左至右依次爲:

  1. 沒有混合,只是正常的資產。圖像背後的灰色bg來自UIView,圖像的bg是透明的。
  2. 乘以kCGBlendModeMultiply
  3. 顏色加深與kCGBlendModeColorBurn

是否有CGBlendMode那將實現替換前景色?另外,是否可以替換前景色(白色)和陰影(黑色)?

回答

2

在混淆了不同的混合選項之後,這段代碼實現了訣竅。唯一需要注意的是紅色色調顯示在陰影中,它在技術上並不正確,但是它的密度極高。

@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; 
}