博客> 图片变灰白色,去掉其本身颜色
图片变灰白色,去掉其本身颜色
2017-11-21 08:21 评论:0 阅读:122 lvhahaha
图片处理 UIImage

有时在开发过程中,设计会提出变态的需求,需要把图片变成黑白色,所以今天搜到了一篇好的文章,然后根据其代码,进行了代码的封装,可以直接使用。。

理论依据: 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新存储单元的位数和显示器本身的性能。如每个象素的颜色用16位二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777216种颜色。 灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。 彩色图象的灰度其实在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R, G,B 的比一般为3:6:1。 任何颜色都由红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度: 1.浮点算法:Gray=R0.3+G0.59+B0.11 2.整数方法:Gray=(R30+G59+B11)/100 3.移位方法:Gray =(R77+G151+B*28)>>8; 4.平均值法:Gray=(R+G+B)/3; 5.仅取绿色:Gray=G; 通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

综上所述,就有了面两种方法,其实也就算一种吧,仅供大家参考。

方法1: //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 = [UIImageimageWithCGImage:CGBitmapContextCreateImage(context)]; CGContextRelease(context); return grayImage; }

方法2: 在.h中声明方法 @interface NSImageGrey : NSObject

  • (UIImage) convertImageToGreyScale:(UIImage) image; @end

在.m中进行实现

@implementation NSImageGrey

  • (UIImage) convertImageToGreyScale:(UIImage) image {

    CGImageRef imageRef = image.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);

    NSUInteger 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 (1) {
            case 1:
                brightness = (77 * red + 28 * green + 151 * blue) / 256;
                *(tmp + 0) = brightness;
                *(tmp + 1) = brightness;
                *(tmp + 2) = brightness;
                break;
            case 2:
                *(tmp + 0) = red;
                *(tmp + 1) = green * 0.7;
                *(tmp + 2) = blue * 0.4;
                break;
            case 3:
                *(tmp + 0) = 255 - red;
                *(tmp + 1) = 255 - green;
                *(tmp + 2) = 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; } @end

收藏
3
sina weixin mail 回到顶部