iPhone – 你如何给图片上色?

我很想知道如何为图片着色(例如,使一个白色的.png红色)。 我已经看到了各种build议,但从来没有证实这实际上是可能的。 我试过这个:

-(UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor { UIGraphicsBeginImageContext(baseImage.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height); CGContextScaleCTM(ctx, 1, -1); CGContextTranslateCTM(ctx, 0, -area.size.height); CGContextSaveGState(ctx); CGContextClipToMask(ctx, area, baseImage.CGImage); [theColor set]; CGContextFillRect(ctx, area); CGContextRestoreGState(ctx); CGContextSetBlendMode(ctx, kCGBlendModeNormal); CGContextDrawImage(ctx, area, baseImage.CGImage); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } myImageView.image = [self colorizeImage:[UIImage imageNamed:@"whiteImage.png"] color:[UIColor redColor]]; 

但它不起作用 – 屏幕上的图像仍然是白色的。

使这个UIImage类别。 它还考虑到iOS 4的比例因子。

 - (UIImage *)imageWithOverlayColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); if (UIGraphicsBeginImageContextWithOptions) { CGFloat imageScale = 1.0f; if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. imageScale = self.scale; UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); } else { UIGraphicsBeginImageContext(self.size); } [self drawInRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(context, kCGBlendModeSourceIn); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

更新 – Swift版本:

 func imageWithColor(color: UIColor) -> UIImage { let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0); drawInRect(rect) let context = UIGraphicsGetCurrentContext() CGContextSetBlendMode(context, .SourceIn) CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillRect(context, rect); let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 

改变你的混合模式乘法 ,你的代码将工作:

 CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 

从iOS 7开始,您可以使用单一颜色为图像着色

目标C

 UIImage *image = [UIImage imageNamed:@"myImage.png"]; UIImageView *imageView = [[UIImageView alloc]initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; imageView.tintColor = [UIColor redColor]; 

Swift 3

 let image = UIImage(named:"myImage.png")?.withRenderingMode(.alwaysTemplate) let imageView = UIImageView(image:image) imageView.tintColor = .red 

这将使用单一颜色对整个图像着色并保留Alpha通道。

我认为从iOS7着色图像的最佳方法是在图像上指定属性UIImageRenderingModeAlwaysTemplate

 myImageView.image = [[UIImage imageNamed:@"myImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

然后用imageView的tintColor对它进行着色

 myImageView.tintColor = [UIColor purpleColor]; //Maybe purple is not the best choice ;) 

我认为这很容易(没有类别需要),当然优化!

注意:如果您使用的是xcassets,则可以在XCode中将呈现属性设置为UIImageRenderingModeAlwaysTemplate ,如下图所示:

UIImageRenderingModeAlwaysTemplate在XCode中

好的,这是怎么回事?

在您的资产创build阶段(不是在应用程序运行时dynamic),反转图像的颜色scheme。 现在是白色的部分 – >透明。 现在是透明的部分 – >无论页面的背景是什么。

在每个图像下,放置一个相同大小的空白视图。 如果您希望将图像变成红色,请将该空白视图的颜色更改为红色。

那可行吗?

@geek小子,让我知道如果这有助于你的家伙…

 // translate/flip the graphics context (for transforming from CG* coords to UI* coords) CGContextTranslateCTM(context, 0, img.size.height); CGContextScaleCTM(context, 1.0, -1.0); 

//用UIGraphicsGetCurrentContext()replace“context”,或者如果你有一个当前上下文的实例。

希望有所帮助。

简短,甜蜜,更好:)

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color

定义UIColorFromRGB使用hex颜色代码,然后调用colorizeImage:withColor

 #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] - (void)viewDidLoad { [super viewDidLoad]; UIImage *imgToColor = [UIImage imageNamed:@"myImage.png"]; imgToColor = [self colorizeImage:imgToColor withColor:UIColorFromRGB(0xff00ff)]; // use normal UIColor or UIColorFromRGB() for hex } - (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); [image drawInRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(context, kCGBlendModeSourceIn); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, rect); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

如果将UIImageView的backgroundColor设置为[UIColor redColor],则原始PNG的透明部分将变为红色。 或者,你可以尝试添加一个半透明的UIView背景颜色红色作为imageview的子视图。 这将为显示图像的视图添加红色阴影。

您首先绘制颜色,然后在其上绘制图像。 除非图像部分透明,否则会完全透支背景颜色。 我build议先尝试绘制原始图像,然后使用kCGBlendModeHue在其上绘制红色kCGBlendModeHue

我不确定你为什么翻转和翻译你的上下文。 你的照片颠倒了吗?