Как использовать UIImage в качестве маски над цветом в Objective-C - PullRequest
19 голосов
/ 26 июля 2011

У меня UIImage полностью черный с альфа-каналом, поэтому некоторые части сероватые, а некоторые полностью прозрачные.Я хочу использовать эти изображения в качестве маски поверх какого-то другого цвета (скажем, белого, чтобы упростить его), поэтому теперь конечным продуктом является белое изображение с прозрачными частями.на сайте документации Apple здесь: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHIJEB

Но я совершенно новичок в Quartz / Core Graphics, поэтому я не могу понять эти примеры.

Кто-нибудь знает ссылку на некоторые полные примеры кода, которые я мог бы использовать, чтобы посмотреть?

Ответы [ 4 ]

51 голосов
/ 26 июля 2011

В iOS 7+ вместо этого следует использовать UIImageRenderingModeAlwaysTemplate.См. https://stackoverflow.com/a/26965557/870313


Создание значков произвольного цвета из основного изображения с черным альфа-изображением (iOS).

// Usage: UIImage *buttonImage = [UIImage ipMaskedImageNamed:@"UIButtonBarAction.png" color:[UIColor redColor]];

+ (UIImage *)ipMaskedImageNamed:(NSString *)name color:(UIColor *)color
{
    UIImage *image = [UIImage imageNamed:name];
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, image.scale);
    CGContextRef c = UIGraphicsGetCurrentContext();
    [image drawInRect:rect];
    CGContextSetFillColorWithColor(c, [color CGColor]);
    CGContextSetBlendMode(c, kCGBlendModeSourceAtop);
    CGContextFillRect(c, rect);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result;
}

Кредиты Оле Цорну: https://gist.github.com/1102091

4 голосов
/ 09 мая 2015

Перевод ответа Джано на Swift:

func ipMaskedImageNamed(name:String, color:UIColor) -> UIImage {
    let image = UIImage(named: name)
    let rect:CGRect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: image!.size.width, height: image!.size.height))
    UIGraphicsBeginImageContextWithOptions(rect.size, false, image!.scale)
    let c:CGContextRef = UIGraphicsGetCurrentContext()
    image?.drawInRect(rect)
    CGContextSetFillColorWithColor(c, color.CGColor)
    CGContextSetBlendMode(c, kCGBlendModeSourceAtop)
    CGContextFillRect(c, rect)
    let result:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return result
}

Использование:

myButton.setImage(ipMaskedImageNamed("grayScalePNG", color: UIColor.redColor()), forState: .Normal)

Редактировать : Согласно этой статье , вы можетепревратить изображение в маску, непрозрачные области которой представлены цветом оттенка.В каталоге ресурсов в разделе Инспектор атрибутов изображения измените Отображать как на Шаблон изображения .Код не требуется.

1 голос
/ 20 февраля 2017

Вот вариант Swift 3, написанный как расширение UIImage:

extension UIImage {
    func tinted(color:UIColor) -> UIImage? {
        let image = self
        let rect:CGRect = CGRect(origin: CGPoint(x: 0, y: 0), size: image.size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, image.scale)
        let context = UIGraphicsGetCurrentContext()!
        image.draw(in: rect)
        context.setFillColor(color.cgColor)
        context.setBlendMode(.sourceAtop)
        context.fill(rect)
        if let result:UIImage = UIGraphicsGetImageFromCurrentImageContext() {
            UIGraphicsEndImageContext()
            return result
        }
        else {
            return nil
        }
    }
}

// Usage
let myImage = #imageLiteral(resourceName: "Check.png") // any image
let blueImage = myImage.tinted(color: .blue)
0 голосов
/ 03 января 2014

Я преобразовал это для OSX здесь как Категория и скопировал ниже. Обратите внимание, что это не для проектов ARC. Для проектов ARC, авто-релиз может быть удален.

- (NSImage *)cdsMaskedWithColor:(NSColor *)color
{
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);

    NSImage *result = [[NSImage alloc] initWithSize:self.size];
    [result lockFocusFlipped:self.isFlipped];

    NSGraphicsContext *context = [NSGraphicsContext currentContext];
    CGContextRef c = (CGContextRef)[context graphicsPort];

    [self drawInRect:NSRectFromCGRect(rect)];

    CGContextSetFillColorWithColor(c, [color CGColor]);
    CGContextSetBlendMode(c, kCGBlendModeSourceAtop);
    CGContextFillRect(c, rect);

    [result unlockFocus];

    return [result autorelease];
}
+ (NSImage *)cdsMaskedImageNamed:(NSString *)name color:(NSColor *)color
{
    NSImage *image = [NSImage imageNamed:name];
    return [image cdsMaskedWithColor:color];
}
...