ios: cambia los colores de un UIImage

Estoy trabajando en una aplicación de Iphone.

Tengo imágenes PNG que representan símbolos. los símbolos son todos negros con un fondo transparente.

¿Hay alguna manera de convertir el color negro en otro? Lo que estoy buscando es algo que puede ayudarme a elegir el color que quiero y al usar los símbolos (en un UIImage) puedo hacer que parezcan del color que yo elija.

He buscado y he encontrado un framework llamado OpenCV que puede manipular imágenes pero no puedo encontrar cómo volver a colorear la imagen.

Cualquier ayuda y sugerencia es muy apreciada.

Gracias

Hola, quiere cambiar remove / one color específico significa usar la siguiente categoría ….

.h archivo:

#import  @interface UIImage (Color) + (UIImage*)setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect; + (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance; +(UIImage *)changeWhiteColorTransparent: (UIImage *)image; +(UIImage *)changeColorTo:(NSMutableArray*) array Transparent: (UIImage *)image; //resizing Stuff... + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize; @end 

archivo .m

 #import  #import "UIImage+Color.h" @implementation UIImage (Color) + (UIImage* )setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect{ // tcv - temporary colored view UIView *tcv = [[UIView alloc] initWithFrame:rect]; [tcv setBackgroundColor:backgroundColor]; // set up a graphics context of button's size CGSize gcSize = tcv.frame.size; UIGraphicsBeginImageContext(gcSize); // add tcv's layer to context [tcv.layer renderInContext:UIGraphicsGetCurrentContext()]; // create background image now UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; // [tcv release]; } + (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance { CGImageRef imageRef = [image CGImage]; NSUInteger width = CGImageGetWidth(imageRef); NSUInteger height = CGImageGetHeight(imageRef); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; NSUInteger bitmapByteCount = bytesPerRow * height; unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char)); CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); CGColorRef cgColor = [color CGColor]; const CGFloat *components = CGColorGetComponents(cgColor); float r = components[0]; float g = components[1]; float b = components[2]; //float a = components[3]; // not needed r = r * 255.0; g = g * 255.0; b = b * 255.0; const float redRange[2] = { MAX(r - (tolerance / 2.0), 0.0), MIN(r + (tolerance / 2.0), 255.0) }; const float greenRange[2] = { MAX(g - (tolerance / 2.0), 0.0), MIN(g + (tolerance / 2.0), 255.0) }; const float blueRange[2] = { MAX(b - (tolerance / 2.0), 0.0), MIN(b + (tolerance / 2.0), 255.0) }; int byteIndex = 0; while (byteIndex < bitmapByteCount) { unsigned char red = rawData[byteIndex]; unsigned char green = rawData[byteIndex + 1]; unsigned char blue = rawData[byteIndex + 2]; if (((red >= redRange[0]) && (red <= redRange[1])) && ((green >= greenRange[0]) && (green <= greenRange[1])) && ((blue >= blueRange[0]) && (blue <= blueRange[1]))) { // make the pixel transparent // rawData[byteIndex] = 0; rawData[byteIndex + 1] = 0; rawData[byteIndex + 2] = 0; rawData[byteIndex + 3] = 0; } byteIndex += 4; } UIImage *result = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)]; CGContextRelease(context); free(rawData); return result; } +(UIImage *)changeWhiteColorTransparent: (UIImage *)image { CGImageRef rawImageRef=image.CGImage; const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; UIGraphicsBeginImageContext(image.size); CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); { //if in iphone CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); } CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); CGImageRelease(maskedImageRef); UIGraphicsEndImageContext(); return result; } +(UIImage *)changeColorTo:(NSMutableArray*) array Transparent: (UIImage *)image { CGImageRef rawImageRef=image.CGImage; // const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; const float colorMasking[6] = {[[array objectAtIndex:0] floatValue], [[array objectAtIndex:1] floatValue], [[array objectAtIndex:2] floatValue], [[array objectAtIndex:3] floatValue], [[array objectAtIndex:4] floatValue], [[array objectAtIndex:5] floatValue]}; UIGraphicsBeginImageContext(image.size); CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); { //if in iphone CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); } CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); CGImageRelease(maskedImageRef); UIGraphicsEndImageContext(); return result; } + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { //UIGraphicsBeginImageContext(newSize); UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } @end 

Cambié el color blanco eliminado a transparente por este código ...

la llamada será ...

  self.rawImage.image=[UIImage changeWhiteColorTransparent:originalStateImage]; 

Espero que esta idea te ayude ...

El más fácil y el más corto:

Forma de hacerlo en caso de que se trate de UIImageView :

Obj-C:

 theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [theImageView setTintColor:[UIColor redColor]]; 

Rápido:

 let theImageView = UIImageView(image: UIImage(named:"foo")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)) theImageView.tintColor = UIColor.redColor() 

Hola, usa este archivo de categoría para cambiar el color de la imagen completa …

.h archivo:

 #import  @interface UIImage (AddtionalFunctionalities) //TintColor... - (UIImage *)imageWithTint:(UIColor *)tintColor; //scale and resize... -(UIImage*)scaleToSize:(CGSize)size; @end 

archivo .m:

 #import "UIImage+AddtionalFunctionalities.h" @implementation UIImage (AddtionalFunctionalities) - (UIImage *)imageWithTint:(UIColor *)tintColor { // Begin drawing CGRect aRect = CGRectMake(0.f, 0.f, self.size.width, self.size.height); CGImageRef alphaMask; // // Compute mask flipping image // { UIGraphicsBeginImageContext(aRect.size); CGContextRef c = UIGraphicsGetCurrentContext(); // draw image CGContextTranslateCTM(c, 0, aRect.size.height); CGContextScaleCTM(c, 1.0, -1.0); [self drawInRect: aRect]; alphaMask = CGBitmapContextCreateImage(c); UIGraphicsEndImageContext(); } // UIGraphicsBeginImageContext(aRect.size); // Get the graphic context CGContextRef c = UIGraphicsGetCurrentContext(); // Draw the image [self drawInRect:aRect]; // Mask CGContextClipToMask(c, aRect, alphaMask); // Set the fill color space CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextSetFillColorSpace(c, colorSpace); // Set the fill color CGContextSetFillColorWithColor(c, tintColor.CGColor); UIRectFillUsingBlendMode(aRect, kCGBlendModeNormal); UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Release memory CGColorSpaceRelease(colorSpace); CGImageRelease(alphaMask); return img; } -(UIImage*)scaleToSize:(CGSize)size { // Create a bitmap graphics context // This will also set it as the current context UIGraphicsBeginImageContext(size); // Draw the scaled image in the current context [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; // Create a new image from current context UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // Pop the current context from the stack UIGraphicsEndImageContext(); // Return our new scaled image return scaledImage; } @end 

la llamada al método será:

  self.outputImage.image=[sourceImage imageWithTint:[UIColor redColor]]; 

Si quieres usar la imagen, usa esto:

 self.outputImage.image=[sourceImage imageWithTint:[UIColor colorWithPatternImage:[UIImage imageNamed: @"red.jpg"]]]; 

Espero que esto ayude…

Establezca el modo de representación de la imagen y luego para el uso del color use la propiedad tintcolor.

 yourImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [yourImageView setTintColor:[UIColor redColor]]; 

Puede crear UIView que almacene UIImageView y cambie el color de fondo de UIview.

 UIView *viewForImage = ....; UIImageView *imageView = .....; ... [viewForImage addSubview: imageView]; [self.view addSubview:viewForImage]; ... 

y luego usar por ejemplo

 [viewForImage setBackgroundColor: [UIColor redColor]]; 

Para jugar con imágenes usando objective-c, principalmente tiene que usar el marco Quartz 2D / CoreGraphics. Supongo que será la forma más fácil de llevar a cabo su tarea.

El enlace a la guía 2D de Quartz está aquí , la guía es bastante completa. Solo busque un lugar en llenar el bitmap con color.

También tengo algunos registros sobre el procesamiento de imágenes pesadas en mi blog, puede echar un vistazo, podría ser útil. http://levonp.blogspot.de/2012/05/quartz-getting-diff-images-of-two.html

Por supuesto, también puedes hacerlo usando productos más avanzados como OpenGL, OpenCV, etc.

Una solución muy simple para cambiar el color de la imagen. Idea: extensiones para UIImage y UIImageView.

Swift 3, Xcode 8.1. https://stackoverflow.com/a/40884483/4488252

Ejemplo de código de mi respuesta (enlace arriba):

 // use extension UIImage newImageView = createNewImageView(x: 100) newImageView.image = UIImage(named: "Apple")?.imageWithColor(newColor: UIColor.blue) // use extension UIImageView newImageView = createNewImageView(x: 160) newImageView.image = UIImage(named: "Apple") newImageView.imageColor = UIColor.green