ios 将彩色照片转化成黑白等几种类型

-(UIImage *)changeColoursImageTograyScaleImage:(UIImage *)anImage type:(int)type

{

    CGImageRef imageRef = anImage.CGImage;

    

    size_t width                   = CGImageGetWidth(imageRef);

    size_t height                  = CGImageGetHeight(imageRef);

    size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);

    size_t bitsPerPixel           = CGImageGetBitsPerPixel(imageRef);

    size_t bytesPerRow         = CGImageGetBytesPerRow(imageRef);

    

    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);

    CGBitmapInfo bitMapInfo      = CGImageGetBitmapInfo(imageRef);

    

    bool shouldInterPolate               = CGImageGetShouldInterpolate(imageRef);

    CGColorRenderingIntent intent   = CGImageGetRenderingIntent(imageRef);

    CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);

    CFDataRef data                         = CGDataProviderCopyData(dataProvider);

    UInt8 *buffer                            = (UInt8  *)CFDataGetBytePtr(data);

    

    NSInteger x,y;

    for (y = 0; y < height; y++) {

        for (x = 0; x < width; x++) {

            UInt8 *tmp;

            tmp = buffer + y * bytesPerRow + x * 4;

            

            UInt8 red,green,blue;

            red     = *(tmp + 0);

            green = *(tmp + 1);

            blue   = *(tmp + 2);

            

            UInt8 brightness;

            switch (type) {

                case 0:

                    brightness = (77 * red + 28 * green + 151 * blue) / 256;

                    *(tmp + 0) = brightness;

                    *(tmp + 1) = brightness;

                    *(tmp + 1) = brightness;

                    break;

                case 1:

                    brightness = (77 * red + 28 * green + 151 * blue) / 256;

                    *(tmp + 0) = red;

                    *(tmp + 1) = green * 0.7;

                    *(tmp + 1) = blue *0.4;

                    break;

                case 2:

                    brightness = (77 * red + 28 * green + 151 * blue) / 256;

                    *(tmp + 0) = 255 - red;

                    *(tmp + 1) = 255 - green;

                    *(tmp + 1) = 255 - blue;

                    break;

                    

                default:

                    *(tmp + 0) = red;

                    *(tmp + 1) = green;

                    *(tmp + 2) = blue;

                    break;

            }

            

        }

    }

    CFDataRef effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));

    CGDataProviderRef effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);

    CGImageRef effectedCGImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitMapInfo, effectedDataProvider, NULL, shouldInterPolate, intent);

    UIImage *effectedImage = [[UIImage alloc]initWithCGImage:effectedCGImage];

    CGImageRelease(effectedCGImage);

    CFRelease(effectedDataProvider);

    CFRelease(effectedData);

    CFRelease(data);

    

    

    return effectedImage;

}

效果图:

posted @ 2015-01-21 12:37  蓝色的风1203  阅读(1083)  评论(0编辑  收藏  举报