将颜色应用于灰度图像,保留alpha值(iOS/Quartz)

wes*_*der 4 iphone alphablending core-graphics quartz-graphics ios

这可能非常简单,但我甚至不确定它叫什么 - 这使得谷歌搜索比平常有用.

我有一个带有alpha的灰度线条图,用于消除锯齿效果.该图用作游戏中的玩家令牌.目前,我已经创建了几个彩色变体(在Photoshop中).但我希望能够以编程方式为原始图像着色,同时保留alpha值.我正在使用Quartz/Core Graphics,我怀疑可能会有某种混合方式可以达到预期的效果 - 但不确定哪种方式,甚至不确定方法是否合适.

liv*_*ech 8

试试这个.

ColorChangingImageView.h:

#import <UIKit/UIKit.h>

@interface ColorChangingImageView : UIView
@property (strong, nonatomic) UIImage *image;
@property (strong, nonatomic) UIColor *colorToChangeInto;
@end
Run Code Online (Sandbox Code Playgroud)

ColorChangingImageView.m:

#import "ColorChangingImageView.h"

@implementation ColorChangingImageView

@synthesize image = _image;
@synthesize colorToChangeInto = _colorToChangeInto;

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -rect.size.height);

    CGImageRef maskImage = [self.image CGImage];
    CGContextClipToMask(context, rect, maskImage);

    [_colorToChangeInto setFill];
    CGContextFillRect(context, rect);

    //blend mode overlay
    CGContextSetBlendMode(context, kCGBlendModeOverlay);

    //draw the image
    CGContextDrawImage(context, rect, _image.CGImage);
}
Run Code Online (Sandbox Code Playgroud)

然后,使用它:

ColorChangingImageView *iv = [[ColorChangingImageView alloc] initWithFrame:rect];
[iv setBackgroundColor:[UIColor clearColor]]; // might not need this, not sure.
[iv setImage:[UIImage imageNamed:@"image.png"]];
[iv setColorToChangeInto:[UIColor blueColor]];
Run Code Online (Sandbox Code Playgroud)

......或者无论如何,非常接近那个.如果它适合您,请告诉我.

您也可以使用第二个参数来CGContextSetBlendMode()获得稍微不同的效果.