如何在iOS中对黑色和透明图像进行填充着色?

11
例如,在iOS工具栏中,您可以拖入您自己的.opaque黑色和透明的.png文件,它会自动添加iOS蓝色的光泽效果。
然而,我想知道如何自己实现这个效果,只用纯色就行了。
例如,如果您有这张图片: Example 您要怎么做才能使整张图片变成纯粉色、蓝色或灰色呢?我想通过编码来减少我在应用程序中保存版本的数量。
谢谢!

可能是如何使用CoreGraphics重新着色图像?的重复问题。 - CodaFi
我认为在运行时尽可能提前对图形进行着色是更有效率的做法。程序化地给PNG着色效率不高,因为读取完整彩色PNG所需的处理能力与读取alpha=0区域的PNG相同。 - James
@CodaFi,非常抱歉,我的研究没有带我到那里。答案也不完全是我要找的。我不明白那段代码是如何工作的,也不知道它如何与UIImage结合,或者在哪里将图像插入上下文中。 - Qiming
在这种情况下,请选择@David H的答案。但是,如果您有一组特定的颜色选择要使用,并且您真的担心下载大小,只需创建所有图像一次并将它们保存到文档目录中。 - James
哦,没事了,你是指通过代码生成图像,然后保存它们吗?现在这样更有意义。我的错。 - Qiming
显示剩余2条评论
2个回答

15

这应该是适合你的:

- (UIImage *)colorImage:(UIImage *)origImage withColor:(UIColor *)color
{
    UIGraphicsBeginImageContextWithOptions(origImage.size, YES, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, (CGRect){ {0,0}, origImage.size} );

    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, origImage.size.height);
    CGContextConcatCTM(context, flipVertical);
    CGContextDrawImage(context, (CGRect){ pt, origImage.size }, [origImage CGImage]);

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

    return image;
}

1
嘿,谢谢你。我一直在想这行代码中的“pt”是什么意思:“CGContextDrawImage(context, (CGRect){ pt, origImage.size }, [origImage CGImage]);”。看起来它好像是一个未声明的变量?不过还是感谢你的帮助。 - Qiming
pt是您希望作为图像原点的CGPoint,如果图像不是新图像的确切大小。如果尺寸完全相同,则为{0,0}。感谢您的感谢!不用客气! - David H
有没有简单的方法来改变这个,以实现相反的效果?即改变非透明部分的颜色。 - Leah Sapan
@LukeSapan我建议你发布自己的问题,链接回这个问题,我相信你几乎会立即得到答案。确保说明您正在使用iOS7、8还是9,并且新版本中添加了新的API(我的答案现在已经有近3年了!)此外,具体说明您想要什么。也就是说,如果您的图标是灰度或彩色的。实际上,看看其他答案-它为您提供了一些想法。 - David H

1
从 iOS 7 开始,您现在可以使用单个颜色对黑色(灰度)/透明图像进行着色,如下所示。
UIImage *image = [UIImage imageNamed:@"myImage.png"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
imageView.tintColor = [UIColor redColor];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接