UIImage叠加颜色:结果不好

时间:2014-02-12 09:20:06

标签: ios uiimage core-graphics

我需要覆盖一个平面颜色的小png。 我使用的代码是:

- (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

2 个答案:

答案 0 :(得分:1)

我会这样做的方式如下(假设你只是iOS7): 反转原始图像:在Photoshop或类似的东西中编辑它,使黑色线条透明(alpha),而白色空间不是(只要它不透明,它与它的颜色无关)。 然后在代码中:

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

其中imageView是包含图像的视图。

答案 1 :(得分:1)

问题在于您使用此行代码创建非视网膜(具有比例因子1.0)图形上下文

UIGraphicsBeginImageContext(self.size);

您可以在文档

中看到这一点
  

此函数等效于调用UIGraphicsBeginImageContextWithOptions函数,其中opaque参数设置为NO,比例因子为1.0。

相反,您应该直接使用UIGraphicsBeginImageContextWithOptions并传递0.0作为比例因子(记录为与主屏幕的比例因子相同):

  

如果指定值0.0,则比例因子将设置为设备主屏幕的比例因子。

即。你应该使用:

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