icon - ios search bar
¿Cómo cambio el color de una imagen parcialmente transparente en iOS? (2)
Tengo una imagen de un solo color que tiene una transparencia parcial. Tengo ambas versiones normal y @ 2X de la imagen. Me gustaría poder tintar la imagen de un color diferente, en código. El siguiente código funciona bien para la imagen normal, pero el @ 2X termina con artefactos. La imagen normal puede tener un problema similar. Si es así, no puedo detectarlo debido a la resolución.
+(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 importa, la imagen de la máscara se carga utilizando UIImage imageNamed:
Además, confirmé que la imagen @ 2X se está cargando cuando se ejecuta en el simulador de retina.
Actualización : El código anterior funciona. Los artefactos que estaba viendo fueron causados por transformaciones adicionales hechas por el consumidor de las imágenes. Esta pregunta podría eliminarse ya que en realidad ya no es una pregunta o se deja para la posteridad.
El código en la pregunta es código de trabajo. El error estaba en otra parte.
He actualizado el código anterior para tener en cuenta las imágenes de resolución de retina:
- (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];
}