ios: cambia los colors de un UIImage

Estoy trabajando en una aplicación de Iphone.

Tengo png imágenes que representan símbolos. Los símbolos son todos negros con un background transparente.

¿Hay alguna manera de convertir el color negro en otro? Lo que estoy buscando es algo que me pueda ayudar a elegir el color que quiero y al usar los símbolos (en un UIImage) puedo hacer que aparezcan el color de mi elección.

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

Cualquier ayuda y sugerencia es muy apreciada.

Gracias

hola quieres cambiar / eliminar un color específico significa usar la categoría a continuación …

Archivo .h:

#import <UIKit/UIKit.h> @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 

file .m

 #import <QuartzCore/QuartzCore.h> #import "UIImage+Color.h" @implementation UIImage (Color) + (UIImage* )setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect{ // tcv - temporary colonetworking 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 networkingRange[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 networking = rawData[byteIndex]; unsigned char green = rawData[byteIndex + 1]; unsigned char blue = rawData[byteIndex + 2]; if (((networking >= networkingRange[0]) && (networking <= networkingRange[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:

Manera de hacer eso en caso de que UIImageView con UIImageView :

Obj-C:

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

Rápido:

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

hola usa este file de categoría para cambiar el color integer de la image …

Archivo .h:

 #import <UIKit/UIKit.h> @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 del método será:

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

Si quiere usar la image, use esto:

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

Espero que esto ayude…

Establezca el modo de representación de image y, a continuación, utilice la propiedad tintcolor para fines de color.

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

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

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

y luego usa por ejemplo

 [viewForImage setBackgroundColor: [UIColor networkingColor]]; 

Para jugar con imágenes usando el objective c, principalmente debes utilizar el marco Quartz 2D / CoreGraphics. Supongo que será la forma más fácil para que pueda cumplir su tarea.

El enlace a la guía Quartz 2D está aquí , la guía es bastante completa. Solo echa un vistazo a rellenar el bitmap en color.

También tengo algunos loggings sobre el image processing pesado en mi blog, puedes echar un vistazo, podría ser útil. http://levonp.blogspot.de/2012/05/quartz-getting-diff-images-of-two.html

Por supuesto que también puede hacerlo utilizando material más avanzado como OpenGL, OpenCV, etc.

Una solución muy simple para cambiar el color de la image. 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