cocos2d 创建一个黑白纹理

@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


原文地址:https://www.cnblogs.com/dyllove98/p/3177788.html