Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ios: change the colors of a UIImage

I am working on an Iphone application.

I have png pictures that represents symbols. symbols are all black with a transparent background.

Is there a way I can turn the black color into another one? What I'm looking for is something that can help me choose the color I want and when using the symbols (in a UIImage) I can make them appear the color of my choice.

I have searched around and found a framework called OpenCV that can manipulate images but I cant find out how to recolor the picture.

Any help and suggestion is greatly appreciated.

Thank you

like image 368
Y2theZ Avatar asked Sep 12 '12 21:09

Y2theZ


People also ask

How do I change the UIImage color in Objective C?

setBlendMode(. multiply) ctx. draw(image. cgImage!, in: imageRect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }

How do I change colors in Swift?

Add a button on your storyboard, select it Go to it's attribute inspector and select 'Background' property to choose the color.


2 Answers

The easiest and shortest:

Way to do that in case when you dealing with UIImageView:

Obj-C:

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

Swift:

let theImageView = UIImageView(image: UIImage(named:"foo")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)) theImageView.tintColor = UIColor.redColor() 
like image 95
skywinder Avatar answered Sep 29 '22 08:09

skywinder


hi you want to change remove/ one specific color means use the below category....

.h file:

#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 

.m file

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

i changed the removed white color to transparent by this code....

the call will be...

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

i hope this idea will help you....

like image 39
Arun Avatar answered Sep 29 '22 09:09

Arun