iOS 渲染圖片 CIFilter

一、首先來(lái)創(chuàng)建一下滑動(dòng)條吧!

- (void)addSlider {
    
    for (int i = 0; i < self.chooseArray.count; i++) {
        
        UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake((kScreenWidth-200)/2, kScreenHeight-180, 200, 30)];
        [slider addTarget:self action:@selector(beautifyImage:) forControlEvents:UIControlEventValueChanged];
        slider.hidden = YES;
        slider.tag = 51000 + i;
        slider.maximumValue = 100;
        if (i == 3) {
            
            slider.minimumValue = 0;
            slider.value = 0;
        } else if (i == 5) {
            
            slider.minimumValue = 0;
            slider.value = 0;
        } else if (i == 6) {
            
            slider.minimumValue = 0;
            slider.value = 100;
        } else {
            
            slider.minimumValue = -100;
            slider.value = 0;
        }
        [self.view addSubview:slider];
        [self.sliderArray addObject:slider];
    }
}```

二、根據(jù)slider調(diào)節(jié)
  • (void)beautifyImage:(UISlider *)slider {

    self.inputImage = [CIImage imageWithCGImage:self.showImage.CGImage];
    CIFilter *filter = nil;

    NSInteger index = slider.tag - 51000;
    if (index == 0 || index == 1 || index == 2) {

      filter = [CIFilter filterWithName:@"CIColorControls"];
    

    } else if (index == 3) {

      filter = [CIFilter filterWithName:@"CISepiaTone"];
    

    } else if (index == 4){

      filter = [CIFilter filterWithName:@"CIHueAdjust"];
    

    } else if (index == 5) {

      filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    

    } else if (index == 6) {

      filter = [CIFilter filterWithName:@"CIHighlightShadowAdjust"];
    

    }
    [filter setValue:self.inputImage forKey:kCIInputImageKey];

switch (index) {
    //亮度   -1---1 默認(rèn)為0
    case 0: {
        [filter setValue:[NSNumber numberWithFloat:(slider.value/200)] forKey:@"inputBrightness"];
    }
        break;
        //對(duì)比度   0---4 默認(rèn)為1
    case 1: {
        
        CGFloat value = 0;
        if (slider.value <= 0) {
            
            value = (slider.value + 100)/200 + 0.5;
        } else {
            
            value = (slider.value + 50)/100 + 1;
        }
        [filter setValue:[NSNumber numberWithFloat:value] forKey:@"inputContrast"];
    }
        break;
        //飽和度      0---2 默認(rèn)為1
    case 2: {
        
        CGFloat value = 0;
        if (slider.value < 0) {
            
            value = (slider.value + 100) / 200 + 0.5;
        } else if (slider.value > 0) {
            
            value = (slider.value / 200) + 1;
        }
        [filter setValue:[NSNumber numberWithFloat:value] forKey:@"inputSaturation"];
    }
        break;
        //色溫    0 -- 1 默認(rèn)為1
    case 3: {
        
        [filter setValue:[NSNumber numberWithFloat:slider.value/200] forKey:@"inputIntensity"];
    }
        break;
        //色調(diào)  -3.14 -- 3.14 默認(rèn)為0
    case 4: {
        [filter setValue:[NSNumber numberWithFloat:(slider.value * M_PI)/500] forKey:@"inputAngle"];
    }
        break;
        //模糊 0 -- 100 默認(rèn)為10
    case 5: {
        [filter setValue:[NSNumber numberWithFloat:slider.value/50] forKey:@"inputRadius"];
    }
        break;
        //高亮  0.3 -- 1 默認(rèn)為1
    case 6: {
        [filter setValue:[NSNumber numberWithFloat:(slider.value / 200 + 0.5)] forKey:@"inputHighlightAmount"];
    }
        break;
    default:
        return;
}

NSString *name = self.chooseArray[index];
self.valueLabel.text = [NSString stringWithFormat:@"%@ %1.f",name,slider.value];
// 轉(zhuǎn)換圖片, 創(chuàng)建基于GPU的CIContext對(duì)象
CIContext *context = [CIContext contextWithOptions: nil];
// 得到過(guò)濾后的圖片
CIImage *outputImage = [filter valueForKey:kCIOutputImageKey];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgimg];

//顯示圖片的ImageView
self.showImageView.image = newImage;
//    self.inputImage = outputImage;
// 釋放C對(duì)象
CGImageRelease(cgimg);

}```

三、如何查看CIFilter的所有屬性?

- (void)showFilertName {
    
    NSArray *cifilter = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
    
    NSLog(@"FilterName:\n%@,,,===%ld", cifilter,cifilter.count);//顯示所有過(guò)濾器名字
    
   for (NSString *filterName in cifilter) {
    
    CIFilter *fltr = [CIFilter filterWithName:filterName];    
    //用一個(gè)過(guò)濾器名字生成一個(gè)過(guò)濾器CIFilter對(duì)象
    NSLog(@":\n%@", [fltr attributes]);
        }
}```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容