ios: change the colors of a UIImage ios: change the colors of a UIImage ios ios

ios: change the colors of a UIImage


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()


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....


hi use this category file to change the image entire color....

.h file:

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

.m file:

#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

the method call will be :

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

if u want to use the image means use this:

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

i hope this will help you...