Comment changer la couleur d'une image partiellement transparente dans iOS?

j'ai une image mono-couleur qui a une transparence partielle. J'ai les versions normale et @2x de l'image. Je voudrais pouvoir tindre l'image d'une couleur différente, en code. Le code ci-dessous fonctionne bien pour l'image normale, mais le @2x se termine avec des artefacts. L'image normale pourrait avoir un problème similaire si c'est le cas, je ne peux pas la détecter à cause de la résolution.

+(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;
}

si c'est important, l'image du masque est chargée en utilisant UIImage imageNamed:. Aussi, j'ai confirmé que l'image @2x est chargement lors du fonctionnement sur le simulateur rétinien.

mise à Jour: Le code ci-dessus fonctionne. Les artefacts que je voyais étaient causés par des transformations supplémentaires faites par le consommateur des images. Cette question pourrait être supprimée car ce n'est plus vraiment une question ou laissé pour la postérité.

17
demandé sur Brandon DuRette 2011-03-24 20:38:30

2 réponses

j'ai mis à jour le code ci-dessus pour tenir compte des images de résolution de rétine:

- (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];
}
9
répondu user3130654 2013-12-23 20:21:45

le code dans la question Est le code de travail. Le bug était ailleurs.

4
répondu Brandon DuRette 2011-04-18 15:43:11