1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
   | - (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];               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]))) {                                       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; }
   |