Estoy intentando cambiar el color de UIImage. Mi código:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Este código funciona, pero la imagen obtenida no está tan bien como debería ser: los píxeles de los límites de la imagen devuelta son intermitentes y no tan suaves como en mi primera imagen. ¿Como puedo resolver este problema?
Respuestas:
Desde iOS 7, esta es la forma más sencilla de hacerlo.
C objetivo:
Swift 2.0:
Swift 4.0:
Guión gráfico:
Primero configure la imagen como plantilla (en la barra derecha - Renderizar como) en sus activos. Entonces el color de la imagen sería el color de tinte aplicado.
fuente
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Ankish gracias!Esta es prácticamente la respuesta anterior, pero un poco abreviada. Esto solo toma la imagen como una máscara y en realidad no "multiplica" ni colorea la imagen.
C objetivo:
Rápido:
fuente
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
porque su versión solo creará gráficos no retina.Otra forma de teñir una imagen es simplemente multiplicarla por un color constante. A veces, esto es preferible porque no "eleva" los valores de color en las áreas negras; mantiene iguales las intensidades relativas en la imagen. El uso de una superposición como tinte tiende a aplanar el contraste.
Este es el código que uso:
Versión rápida
fuente
En Swift 3.0
En Swift 2.0
Que disfruten, pioneros de Swift
fuente
Solución Swift 4.2
fuente
A partir de iOS 10 puedes usar
UIGraphicsImageRenderer
:fuente
Si no tiene que hacerlo mediante programación, puede hacerlo usando la interfaz de usuario de Xcode.
Si va a la imagen en su carpeta de activos de imagen, abra el inspector en el lado derecho y habrá un menú desplegable "Renderizar como" con las siguientes opciones:
Una vez que haya realizado la selección de Plantilla, puede cambiar el tintColor de la imagen como desee, ya sea utilizando la interfaz de usuario del guión gráfico de Xcode o mediante programación.
Ver esta imagen:
fuente
Aquí está mi adaptación de la respuesta de @ Anna. Aquí dos puntos clave:
destinationIn
modo de fusiónUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
para obtener una imagen fluidaCódigo en Swift 3 :
fuente
self
dentro de su método y eliminar el parámetro de imagen innecesarioBase en la respuesta de @ Anna y reescribo para swift 2.2 y maneja la imagen con canal alfa:
fuente
El código de Anna funciona bien para copiar un UIImage.image sobre un fondo de .image coloreado utilizando kCGBlendModeNormal en lugar de kCGBlendModeMultiply. Por ejemplo,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
colocará el contenido de mainImage.image sobre el tinte yourColor mientras conserva la opacidad de yourColor. Esto resolvió mi problema de colocar un color de fondo con opacidad detrás de una imagen para guardarla en el carrete.fuente
Swift 3:
fuente
Versión Swift 3.0 del maravilloso código de Anna:
fuente
Para iOS 13 y versiones posteriores:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
fuente