Как изменить цвет частично прозрачного изображения в iOS? - PullRequest
17 голосов
/ 24 марта 2011

У меня одноцветное изображение с частичной прозрачностью.У меня есть как нормальная, так и @ 2X версии изображения.Я хотел бы иметь возможность тонировать изображение другого цвета, в коде.Приведенный ниже код отлично работает для обычного изображения, но @ 2X заканчивается артефактами.У обычного изображения может быть похожая проблема. Если так, я не могу обнаружить его из-за разрешения.

+(UIImage *) newImageFromMaskImage:(UIImage *)mask inColor:(UIColor *) color {
    CGImageRef maskImage = mask.CGImage;
    CGFloat width = mask.size.width;
    CGFloat height = mask.size.height;
    CGRect bounds = CGRectMake(0,0,width,height);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    CGContextClipToMask(bitmapContext, bounds, maskImage);
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor);    
    CGContextFillRect(bitmapContext, bounds);

    CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext);
    CGContextRelease(bitmapContext);

    UIImage *result = [UIImage imageWithCGImage:mainViewContentBitmapContext];
    return result;
}

Если это имеет значение, изображение маски загружается с помощью UIImage imageNamed:.Также я подтвердил, что изображение @ 2X загружается при запуске на симуляторе сетчатки.

Обновление : вышеуказанный код работает.Артефакты, которые я видел, были вызваны дополнительными преобразованиями, выполненными потребителем изображений.Этот вопрос может быть удален, поскольку он больше не является вопросом или оставлен для потомков.

Ответы [ 2 ]

9 голосов
/ 24 декабря 2013

Я обновил код выше, чтобы учесть изображения с разрешением сетчатки:

- (UIImage *) changeColorForImage:(UIImage *)mask toColor:(UIColor*)color {

CGImageRef maskImage = mask.CGImage;
CGFloat width = mask.scale * mask.size.width;
CGFloat height = mask.scale * mask.size.height;
CGRect bounds = CGRectMake(0,0,width,height);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGContextClipToMask(bitmapContext, bounds, maskImage);
CGContextSetFillColorWithColor(bitmapContext, color.CGColor);    
CGContextFillRect(bitmapContext, bounds);

CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);

return [UIImage imageWithCGImage:mainViewContentBitmapContext scale:mask.scale orientation:UIImageOrientationUp];
}
4 голосов
/ 18 апреля 2011

Код в вопросе является рабочим кодом.Ошибка была в другом месте.

...