objective c - tos - Cómo usar un UIImage como máscara sobre un color en Objective-C
periodo contagio resfriado (4)
Aquí hay una variación en Swift 3, escrita como una extensión de 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)
Tengo un UIImage que es todo negro con un canal alfa, por lo que algunas partes son de color grisáceo y otras partes son completamente transparentes. Quiero usar esas imágenes como una máscara sobre algún otro color (digamos blanco para que sea más fácil), por lo que el producto final ahora es una imagen en blanco con partes de ella transparentes.
He estado buscando en el sitio de documentación de Apple aquí: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHIJEB
Pero soy completamente nuevo en Quartz / Core Graphics, así que no puedo entender esos ejemplos.
¿Alguien sabe de un enlace a algunos ejemplos de código completo que podría usar para mirar?
He convertido esto para OSX here como una categoría y copiado a continuación. Tenga en cuenta que esto es para proyectos que no son ARC. Para proyectos ARC, el autorelease puede ser eliminado.
- (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];
}
Traduciendo la respuesta de Jano en 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
}
Uso:
myButton.setImage(ipMaskedImageNamed("grayScalePNG", color: UIColor.redColor()), forState: .Normal)
Edición : según este article , puede convertir una imagen en una máscara cuyas áreas opacas están representadas por el color del tinte. Dentro del catálogo de activos, en el Inspector de atributos de la imagen, cambie Renderizar como imagen de plantilla . No es necesario el código.
En iOS 7+ deberías usar UIImageRenderingModeAlwaysTemplate
en UIImageRenderingModeAlwaysTemplate
lugar. Consulte https://.com/a/26965557/870313
Creación de iconos de colores arbitrarios a partir de una imagen maestra negra con alfa (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;
}
Créditos a Ole Zorn: https://gist.github.com/1102091