Применение цвета к полутоновому изображению с сохранением альфа-значений (iOS / Quartz) - PullRequest
4 голосов
/ 12 января 2011

Это, вероятно, очень просто, но я даже не уверен, как это называется - что делает поиск в Google немного менее полезным, чем обычно.

У меня есть серая шкала с альфа-каналом для сглаживания. Этот рисунок используется как жетон игрока в игре. В настоящее время я создал пару раскрашенных вариантов (в фотошопе). Но я хотел бы иметь возможность программно подкрашивать исходное изображение, сохраняя при этом альфа-значения. Я использую Quartz / Core Graphics, и я подозреваю, что может быть какая-то смесь, которая достигла бы желаемого эффекта - но не уверена, какой или даже если это правильный подход.

1 Ответ

8 голосов
/ 08 января 2013

Попробуйте это.

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() для слегка отличающихся эффектов.

...