@interface myGrayTexture : CCTexture2D // @param exposure 曝光 +(id) textureWithFile:(NSString*) file exposure:(int) exposure; @end
@implementation myGrayTexture typedef enum { ALPHA = 0, BLUE = 1, GREEN = 2, RED = 3 } PIXELS; +(UIImage*) getGrayImage:(NSString*) file exposure:(int) exposure{ UIImage* img = [UIImage imageNamed:file]; if (nil == img) { return nil; } CGSize size = [img size]; int width = size.width; int height = size.height; // the pixels will be painted to this array uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); // clear the pixels so any transparency is preserved memset(pixels, 0, width * height * sizeof(uint32_t)); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // create a context with RGBA pixels CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); // paint the bitmap to our context which will fill in the pixels array CGContextDrawImage(context, CGRectMake(0, 0, width, height), [img CGImage]); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE]; // set the pixels to gray rgbaPixel[RED] = gray + (gray > 0 ? exposure : 0); rgbaPixel[GREEN] = gray + (gray > 0 ? exposure : 0); rgbaPixel[BLUE] = gray + (gray > 0 ? exposure : 0); } } // create a new CGImageRef from our context with the modified pixels CGImageRef image = CGBitmapContextCreateImage(context); // we're done with the context, color space, and pixels CGContextRelease(context); CGColorSpaceRelease(colorSpace); free(pixels); // make a new UIImage to return UIImage *resultUIImage = [UIImage imageWithCGImage:image]; // we're done with image now too CGImageRelease(image); return resultUIImage; } +(id) textureWithFile:(NSString*) file exposure:(int) exposure{ UIImage* img = [self getGrayImage:file exposure:exposure]; if (img) { return [[[myGrayTexture alloc] initWithImage:img] autorelease]; } return nil; } @end