这可能非常简单,但我甚至不确定它被称为什么 - 这使得谷歌搜索比平常更少用。
我有一个带有alpha的灰度线条图像,用于游戏中的玩家代币,并产生反锯齿效果。目前,我已经在Photoshop中创建了一些着色变体。但是,我想能够以编程方式着色原始图像,同时保留alpha值。我正在使用Quartz / Core Graphics,并且我怀疑可能有某种混合可以实现所需的效果 - 但不确定哪种混合或者是否是正确的方法。
这可能非常简单,但我甚至不确定它被称为什么 - 这使得谷歌搜索比平常更少用。
我有一个带有alpha的灰度线条图像,用于游戏中的玩家代币,并产生反锯齿效果。目前,我已经在Photoshop中创建了一些着色变体。但是,我想能够以编程方式着色原始图像,同时保留alpha值。我正在使用Quartz / Core Graphics,并且我怀疑可能有某种混合可以实现所需的效果 - 但不确定哪种混合或者是否是正确的方法。
请尝试以下方法。
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()
的第二个参数,以获得略微不同的效果。
drawRect:
中实现的,所以除非你要每帧更改色调之类的操作,否则我认为你不会遇到效率问题。请查看我发布的链接以获取我的答案(可能与您寻找的略有不同)。实际上,也许我应该在这里发布另一个答案。 - livingtech