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 ,如下图所示:
好的,这是怎么回事?
在您的资产创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
。
我不确定你为什么翻转和翻译你的上下文。 你的照片颠倒了吗?