我需要覆盖一个平面颜色的小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;
}
但结果不是很平滑......这里原始图像(黑色)和覆盖图像(白色图像)
答案 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