2014-02-12 92 views
0

我需要覆蓋一個平坦的顏色的小PNG。 我使用的代碼是:UIImage覆蓋顏色:效果不好

- (UIImage *)overlayWithColor:(UIColor *)overlayColor { 


    UIGraphicsBeginImageContext(self.size); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 


    [overlayColor setFill]; 

    CGContextTranslateCTM(context, 0, self.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); 
    CGContextDrawImage(context, rect, self.CGImage); 


    CGContextClipToMask(context, rect, self.CGImage); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context,kCGPathFill); 

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

    return coloredImg; 

} 

但結果不是很順暢......這裏的原始圖像(黑的),並在重疊的圖像(白色的)

enter image description here enter image description here

回答

1

我會這樣做的方式如下(假設你只是iOS7): 反轉原始圖像:在Photoshop中編輯或類似的東西,使黑色線條是透明的(alpha),白色空間不是(它無關緊要,只要它不透明)。 然後在代碼:

imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
[imageView.image setTintColor:[UIColor orangeColor]]; 

哪裏ImageView的是查看包含你的形象。

1

的問題是,你正在創建一個非視網膜(帶刻度係數1.0)的圖形上下文與這行代碼

UIGraphicsBeginImageContext(self.size); 

您可以將文檔

此功能在看到這相當於調用UIGraphicsBeginImageContextWithOptions函數,將opaque參數設置爲NO並且縮放因子爲1.0。

相反,你應該直接使用UIGraphicsBeginImageContextWithOptions,並通過爲比例係數爲0.0(這是記錄是相同主屏幕的比例因子):

如果指定的0.0值,比例因子被設置爲設備主屏幕的比例因子。

I.e.您應該使用:

UIGraphicsBeginImageContextWithOptions(self.size, 
             NO, // opaque or not. NO means transparent 
             0.0); // scale factor. 0 means same as device