iOS开发之图片滤镜、饱和度等处理

1. 照片变黑白(遍历像素)

    CGImageRef imageRef = self.imageView.image.CGImage;
    // 一个字节 = 8bit(位) 每行有 17152 个字节,即每行有 17152 * 8 个位   一个像素有 4 个字节
    size_t width = CGImageGetWidth(imageRef);
    size_t height = CGImageGetHeight(imageRef);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
    size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
    // 颜色空间
    uint32_t bitmapInfo = CGImageGetBitmapInfo(imageRef);
    CGColorSpaceRef space = CGImageGetColorSpace(imageRef);
    
    //获取每个像素的字节数据集合
    CGDataProviderRef dataProviderRef = CGImageGetDataProvider(imageRef);
    CFDataRef dataRef = CGDataProviderCopyData(dataProviderRef);
    UInt8 * bytesPtr = CFDataGetMutableBytePtr((CFMutableDataRef)dataRef);
    NSUInteger length = CFDataGetLength(dataRef);
    
    // 一个像素由四个字节byte组成
    for (int i = 0; i < length; i += 4) {
        UInt8 red = bytesPtr[i];
        UInt8 green = bytesPtr[i + 1];
        UInt8 blue = bytesPtr[i + 2];
        UInt8 average = (red + green + blue) / 3;
        bytesPtr[i] = average;
        bytesPtr[i + 1] = average;
        bytesPtr[i + 2] = average;
    }
    
    CGContextRef imageContextRef = CGBitmapContextCreate(bytesPtr, width, height, bitsPerComponent, bytesPerRow, space, bitmapInfo);
    CGImageRef finalImageRef = CGBitmapContextCreateImage(imageContextRef);
    UIImage * finalImage = [UIImage imageWithCGImage:finalImageRef];
    self.imageView.image = finalImage;
    
    CGImageRelease(finalImageRef);
    CGContextRelease(imageContextRef);
    CFRelease(dataRef);

2. 照片饱和度调整

    CIImage *beginImage = [CIImage imageWithCGImage:self.imageView.image.CGImage];
    CIFilter * filter = [CIFilter filterWithName:@"CIColorControls"];
    [filter setValue:beginImage forKey:kCIInputImageKey];
    //饱和度 0---2 默认为1
    [filter setValue:[NSNumber numberWithFloat:self.slider.value*2] forKey:@"inputSaturation"];
    
    // 得到过滤后的图片
    CIImage *outputImage = [filter outputImage];
    // 转换图片, 创建基于GPU的CIContext对象
    CIContext *context = [CIContext contextWithOptions: nil];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];
    // 显示图片
    [self.imageView setImage:newImg];
    // 释放C对象
    CGImageRelease(cgimg);

3. 照片亮度调整

    CIImage *beginImage = [CIImage imageWithCGImage:self.imageView.image.CGImage];
    CIFilter * filter = [CIFilter filterWithName:@"CIColorControls"];
    [filter setValue:beginImage forKey:kCIInputImageKey];
    //亮度 -1---1 默认为0
    [filter setValue:[NSNumber numberWithFloat:(self.slider.value-0.5)*2] forKey:@"inputBrightness"];
    
    // 得到过滤后的图片
    CIImage *outputImage = [filter outputImage];
    // 转换图片, 创建基于GPU的CIContext对象
    CIContext *context = [CIContext contextWithOptions: nil];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];
    // 显示图片
    [self.imageView setImage:newImg];
    // 释放C对象
    CGImageRelease(cgimg);

4. 照片对比度调整

    CIImage *beginImage = [CIImage imageWithCGImage:self.imageView.image.CGImage];
    CIFilter * filter = [CIFilter filterWithName:@"CIColorControls"];
    [filter setValue:beginImage forKey:kCIInputImageKey];
    //对比度 0---4 默认为1
    [filter setValue:[NSNumber numberWithFloat:self.slider.value*4.00f] forKey:@"inputContrast"];
    
    // 得到过滤后的图片
    CIImage *outputImage = [filter outputImage];
    // 转换图片, 创建基于GPU的CIContext对象
    CIContext *context = [CIContext contextWithOptions: nil];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];
    // 显示图片
    [self.imageView setImage:newImg];
    // 释放C对象
    CGImageRelease(cgimg);

5. 照片添加纯色滤镜

    UIGraphicsBeginImageContext(CGSizeMake(self.imageView.image.size.width, self.imageView.image.size.height));
    CGContextRef imageContextRef = UIGraphicsGetCurrentContext();
    [self.imageView.image drawInRect:CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height)];
    //红色滤镜
    UIColor *color = [UIColor clearColor];
    switch (self.segmentedControl.selectedSegmentIndex) {
        case 0://
            color = [UIColor colorWithRed:1 green:0 blue:0 alpha:self.slider.value];
            break;
        case 1://绿
            color = [UIColor colorWithRed:0 green:1 blue:0 alpha:self.slider.value];
            break;
        case 2://
            color = [UIColor colorWithRed:0 green:0 blue:1 alpha:self.slider.value];
            break;
        default:
            break;
    }
    // 给上下文设置颜色
    CGContextSetFillColorWithColor(imageContextRef, color.CGColor);
    // 设置渲染模式
    CGContextSetBlendMode(imageContextRef, kCGBlendModeNormal);
    // 填充上下文
    CGContextFillRect(imageContextRef, CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height));
    CGImageRef finalImageRef = CGBitmapContextCreateImage(imageContextRef);
    UIImage * finalImage = [UIImage imageWithCGImage:finalImageRef];
    self.imageView.image = finalImage;
    
    CGImageRelease(finalImageRef);
    CGContextRelease(imageContextRef);

参考自:https://www.jianshu.com/p/d375432ebb0d

posted @ 2020-08-10 13:49  kawerd  阅读(622)  评论(0编辑  收藏  举报