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

4

这可能非常简单,但我甚至不确定它被称为什么 - 这使得谷歌搜索比平常更少用。

我有一个带有alpha的灰度线条图像,用于游戏中的玩家代币,并产生反锯齿效果。目前,我已经在Photoshop中创建了一些着色变体。但是,我想能够以编程方式着色原始图像,同时保留alpha值。我正在使用Quartz / Core Graphics,并且我怀疑可能有某种混合可以实现所需的效果 - 但不确定哪种混合或者是否是正确的方法。


你最终解决了这个问题吗?如果是的话,能否分享一下你的解决方案?(我今天在这里发布了一个类似的问题:http://stackoverflow.com/questions/14176569/i-want-to-use-quartz-to-make-a-single-color-image-a-different-color) - livingtech
@livingtech - 不,我从来没有尝试过。但是我仍然想知道这是否可能,而且效率还可以接受。 - westsider
肯定是可以的,而且我是在drawRect:中实现的,所以除非你要每帧更改色调之类的操作,否则我认为你不会遇到效率问题。请查看我发布的链接以获取我的答案(可能与您寻找的略有不同)。实际上,也许我应该在这里发布另一个答案。 - livingtech
1个回答

8

请尝试以下方法。

ColorChangingImageView.h:

#import <UIKit/UIKit.h>

@interface ColorChangingImageView : UIView
@property (strong, nonatomic) UIImage *image;
@property (strong, nonatomic) UIColor *colorToChangeInto;
@end

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);
}

然后,要使用它:
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]];

...或者说,非常接近那个效果。如果这对你有帮助,请告诉我。

您还可以尝试调整CGContextSetBlendMode()的第二个参数,以获得略微不同的效果。


谢谢。我得等一段时间才能尝试这个。我换了工作,现在很少有机会进行iOS编码...唉。 :-) - westsider

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