# oc 图片变黑白

1. 浮点 算法：Gray=R*0.3+G*0.59+B*0.11
2.整数方法：Gray=(R*30+G*59+B*11)/100
3.移位方法：Gray =(R*77+G*151+B*28)>>8;
4. 平均值法：Gray=（R+G+B）/3;
5.仅取绿色：Gray=G；

//UIImage: 去色功能的实现（图片灰色显示）
- ( UIImage *)grayImage:( UIImage *)sourceImage {

int  width = sourceImage. size . width ;

int  height = sourceImage. size . height ;

CGColorSpaceRef  colorSpace =  CGColorSpaceCreateDeviceGray ();

CGContextRef  context =  CGBitmapContextCreate  ( nil , width, height, 8 , 0 , colorSpace, kCGImageAlphaNone );

CGColorSpaceRelease (colorSpace);

if  (context == NULL ) {

return  nil ;
}

CGContextDrawImage (context, CGRectMake ( 0 , 0 , width, height), sourceImage. CGImage );

UIImage  *grayImage = [ UIImage imageWithCGImage : CGBitmapContextCreateImage (context)];

CGContextRelease (context);

return  grayImage;
}

- ( UIImage *)grayscaleImageForImage:( UIImage *)image {

const  int  RED = 1 ;

const  int  GREEN = 2 ;

const  int  BLUE = 3 ;

// Create image rectangle with current image width/height

CGRect  imageRect =  CGRectMake ( 0 , 0 , image. size . width * image. scale , image. size . height * image. scale );

int  width = imageRect. size . width ;

int  height = imageRect. 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), [image 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;
rgbaPixel[GREEN] = gray;
rgbaPixel[BLUE] = gray;
}
}

// create a new CGImageRef from our context with the modified pixels

CGImageRef  imageRef =  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 :imageRef scale :image. scale orientation : UIImageOrientationUp ];

// we're done with image now too

CGImageRelease (imageRef);

return  resultUIImage;
}