灰度公式
对于彩色转灰度,有一个很著名的心理学公式
Gray = R*0.299 + G*0.587 + B*0.114
oc转换方法
- (UIImage*)imageToGray{
CGImageRef imageRef = [self CGImage];
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
size_t bitsPerComponent = 8;
size_t bytesPerRow = width * 4;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
uint32_t *pixels = (uint32_t *) calloc(bytesPerRow * height, sizeof(uint8_t));
// kCGImageAlphaPremultipliedFirst ARGB
// kCGImageAlphaPremultipliedLast RGBA
// kCGBitmapByteOrder32Little 小端 (低位字节在前)
// kCGBitmapByteOrder32Big 大端 (高位字节在前)
CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];
//RGB
// uint32_t gray = 0.3 * rgbaPixel[0] + 0.59 * rgbaPixel[1] + 0.11 * rgbaPixel[2];
uint32_t gray = (rgbaPixel[0]*19595 + rgbaPixel[1]*38469 + rgbaPixel[2]*7472) >> 16;
rgbaPixel[0] = gray;
rgbaPixel[1] = gray;
rgbaPixel[2] = gray;
}
}
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
free(pixels);
UIImage *resultImage = [UIImage imageWithCGImage:newImageRef];
CGImageRelease(newImageRef);
return resultImage;
}
网友评论