titlelabel settitle color buttons iphone

iphone - settitle - UIImage cambio de color?



uicontrol swift (11)

Creo que puedes crear otro contexto configurando el color de contexto en RGB que deseas colorear tu imagen. Luego dibuje su UIImage en ese contexto y use ese contexto en lugar de usar directamente su imagen. Este es un concepto. De esta manera estás creando un buffer fuera de pantalla con una imagen coloreada. No probé esto en cacao, solo en carbono, pero supongo que funcionará de la misma manera.

¿Cómo puedo cambiar el color del UIImage a través de la programación? ¿Alguna ayuda, por favor? Si envío un UIImage, ¿su color necesita cambiar alguna ayuda, por favor? Si cambio el color RGB a través de bitmaphandling, no funciona.


Echa un vistazo a mi post (en su mayoría solo remixando código) .

Edición : este código crea básicamente un nuevo CGContext , dibuja una capa en él con el nuevo color y devuelve un nuevo UIImage partir de eso. No he profundizado en este código en un tiempo, pero parece que solo dibuja un UIImage con la misma forma que el original, por lo que es un límite (pierde cualquier detalle en la imagen).


El gran post mencionado por user576924 me funcionó muy bien: coffeeshopped.com/2010/09/… colorear coffeeshopped.com/2010/09/…

y en veloz

extension UIImage { func imageWithColor( color : UIColor ) -> UIImage { // begin a new image context, to draw our colored image onto UIGraphicsBeginImageContext(self.size) // get a reference to that context we created let context = UIGraphicsGetCurrentContext(); // set the fill color color.setFill() // translate/flip the graphics context (for transforming from CG* coords to UI* coords CGContextTranslateCTM(context, 0, self.size.height) CGContextScaleCTM(context, 1.0, -1.0) // set the blend mode to color burn, and the original image CGContextSetBlendMode(context, kCGBlendModeColor) let rect = CGRect(origin: CGPointZero, size: self.size) CGContextDrawImage(context, rect, self.CGImage) // set a mask that matches the shape of the image, then draw (color burn) a colored rectangle CGContextClipToMask(context, rect, self.CGImage) CGContextAddRect(context, rect) CGContextDrawPath(context,kCGPathFill) // generate a new UIImage from the graphics context we drew onto let coloredImg = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() //return the color-burned image return coloredImg }

}

Tenga en cuenta que también cambié "kCGBlendModeColorBurn" a "kCGBlendModeColor" como se menciona en la sección de comentarios de la publicación.


Hay una gran publicación sobre esto aquí: coffeeshopped.com/2010/09/…

La única advertencia que tengo con el código actual es que usarlo en las imágenes de la retina resultará en una pérdida de la ''resolución'' más alta para estas imágenes. Actualmente estoy buscando una solución para esto ...


Hmmm, ¿no se supone que el orden de los bytes es RGBA? Los estás configurando como ARGB ...


Los datos RGB que está utilizando son solo una copia. Una vez que haya terminado de realizar cambios, debe volver a convertir esos datos en una imagen.

Primero hago un nuevo mapa de bits:

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); ctx = CGBitmapContextCreate( malloc(dataSize), width, height, 8, // CGImageGetBitsPerComponent(cgImage), bytesPerRow, //CGImageGetBytesPerRow(cgImage), space, //kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big ); kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little); //kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little); CGColorSpaceRelease( space ); // now draw the image into the context CGRect rect = CGRectMake( 0, 0, CGImageGetWidth(cgImage), CGImageGetHeight(cgImage) ); CGContextDrawImage( ctx, rect, cgImage );

Y consigue los píxeles:

pixels = CGBitmapContextGetData( ctx );

Suponiendo que sus datos de píxeles provienen de pixels = CGBitmapContextGetData( ctx ); luego toma ese contexto y construye una nueva imagen a partir de él:

CGImageRef newImg = CGBitmapContextCreateImage(ctx); [[UIImage imageWithCGImage:newImg] drawInRect:rect]; CGImageRelease(newImg);


Para mí esto funcionó:

extension UIImage { class func image(image: UIImage, withColor color: UIColor) -> UIImage { UIGraphicsBeginImageContextWithOptions(CGSizeMake(image.size.width, image.size.height), false, image.scale) let context = UIGraphicsGetCurrentContext() color.set() CGContextTranslateCTM(context, 0, image.size.height) CGContextScaleCTM(context, 1, -1) let rect = CGRectMake(0, 0, image.size.width, image.size.height) CGContextClipToMask(context, rect, image.CGImage) CGContextFillRect(context, rect) let coloredImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return coloredImage } }



Una forma de lograr esto es desaturar su imagen y agregar un tinte encima de esa imagen con el color que desee.

Desaturar

-(UIImage *) getImageWithUnsaturatedPixelsOfImage:(UIImage *)image { const int RED = 1, GREEN = 2, BLUE = 3; CGRect imageRect = CGRectMake(0, 0, image.size.width*2, image.size.height*2); int width = imageRect.size.width, height = imageRect.size.height; uint32_t * pixels = (uint32_t *) malloc(width*height*sizeof(uint32_t)); memset(pixels, 0, width * height * sizeof(uint32_t)); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); CGContextDrawImage(context, CGRectMake(0, 0, width, height), [image CGImage]); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { uint8_t * rgbaPixel = (uint8_t *) &pixels[y*width+x]; uint32_t gray = (0.3*rgbaPixel[RED]+0.59*rgbaPixel[GREEN]+0.11*rgbaPixel[BLUE]); rgbaPixel[RED] = gray; rgbaPixel[GREEN] = gray; rgbaPixel[BLUE] = gray; } } CGImageRef newImage = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); free(pixels); UIImage * resultUIImage = [UIImage imageWithCGImage:newImage scale:2 orientation:0]; CGImageRelease(newImage); return resultUIImage; }

Superposición de color

-(UIImage *) getImageWithTintedColor:(UIImage *)image withTint:(UIColor *)color withIntensity:(float)alpha { CGSize size = image.size; UIGraphicsBeginImageContextWithOptions(size, FALSE, 2); CGContextRef context = UIGraphicsGetCurrentContext(); [image drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:1.0]; CGContextSetFillColorWithColor(context, color.CGColor); CGContextSetBlendMode(context, kCGBlendModeOverlay); CGContextSetAlpha(context, alpha); CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(CGPointZero.x, CGPointZero.y, image.size.width, image.size.height)); UIImage * tintedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return tintedImage; }

Cómo

//For a UIImageView yourImageView.image = [self getImageWithUnsaturatedPixelsOfImage:yourImageView.image]; yourImageView.image = [atom getImageWithTintedColor:yourImageView.image withTint:[UIColor redColor] withIntensity:0.7]; //For a UIImage yourImage = [self getImageWithUnsaturatedPixelsOfImage:yourImage]; yourImage = [atom getImageWithTintedColor:yourImageView.image withTint:[UIColor redColor] withIntensity:0.7];

Puedes cambiar el color del tinte a lo que desees.


prueba esto

- (UIImage *)imageWithOverlayColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); if (UIGraphicsBeginImageContextWithOptions) { CGFloat imageScale = 1.0f; if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. imageScale = self.scale; UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); } else { UIGraphicsBeginImageContext(self.size); } [self drawInRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(context, kCGBlendModeSourceIn); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }


Si solo necesita que se vea diferente, solo use imageView.tintColor (iOS 7+). La captura es, establecer tintColor no hace nada por defecto:

Para hacerlo funcionar, use imageWithRenderingMode:

var image = UIImage(named: "")! image = image.imageWithRenderingMode(.AlwaysTemplate) let imageView = ... imageView.tintColor = UIColor(red: 0.35, green: 0.85, blue: 0.91, alpha: 1) imageView.image = image

Y ahora funcionará:

Enlace a la documentación.

Actuación

La configuración de la imagen después de configurar UIImageView evita repetir operaciones costosas:

// Good usage let imageView = ... imageView.tintColor = yourTintColor var image = UIImage(named: "")! image = image.imageWithRenderingMode(.AlwaysTemplate) imageView.image = image // Expensive // Bad usage var image = UIImage(named: "")! image = image.imageWithRenderingMode(.AlwaysTemplate) let imageView = ... imageView.image = image // Expensive imageView.frame = ... // Expensive imageView.tintColor = yourTint // Expensive

Obtener y configurar la imagen de forma asíncrona reduce el retraso en el desplazamiento y la animación (especialmente cuando se tiñe una imagen dentro de un UICollectionViewCell o UITableViewCell ):

let imageView = cell.yourImageView imageView.image = nil // Clear out old image imageView.tintColor = UIColor(red: 0.35, green: 0.85, blue: 0.91, alpha: 1) // Setting the image asynchronously reduces stuttering // while scrolling. Remember, the image should be set as // late as possible to avoid repeating expensive operations // unnecessarily. dispatch_async(dispatch_get_main_queue(), { () -> Void in var image = UIImage(named: "")! image = image.imageWithRenderingMode(.AlwaysTemplate) imageView.image = image })