coreImage框架的簡單使用

最近對圖像處理方面的東西比較感興趣,剛好看了CoreImage這個(gè)強(qiáng)大的圖像處理框架,下面就跟大家分享一下。

首先,先了解一下CoreImage這個(gè)框架以及其中常用的幾個(gè)類:

CoreImage是IOS5中新加入的一個(gè)Objective-c的框架,里面提供了強(qiáng)大高效的圖像處理功能,用來對基于像素的圖像進(jìn)行操作與分析。IOS提供了很多強(qiáng)大的濾鏡(Filter),這些Filter提供了各種各樣的效果,并且還可以通過濾鏡鏈將各種效果的Filter疊加起來,形成強(qiáng)大的自定義效果,如果你對該效果不滿意,還可以子類化濾鏡。

· CIImage

是保存圖像數(shù)據(jù)的類,它有四種比較常用的初始化方式:

1.imageWithCGImage: 
2.imageWithContentsOfURL:
3.imageWithCVImageBuffer:
4.imageWithData:

也可以通過圖像數(shù)據(jù)類比如UIImage,CGImageRef等等初始化。

· CIFilter

濾鏡類,這個(gè)框架中對圖片屬性進(jìn)行細(xì)節(jié)處理的類。濾鏡使用鍵-值來設(shè)置輸入值,一旦這些值設(shè)置好,CIFilter就可以用來生成新的CIImage輸出圖像了。它的初始化一般用:

CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur"];           
下面是查詢需要的濾鏡種類的方法:

1.查詢 效果分類中 包含什么效果:filterNamesInCategory:
(1)按住command 點(diǎn)擊CIFilter 進(jìn)入接口文件 找到第128行-148行全部都是 效果分類
(2)選擇其中某一個(gè)分類 NSLog -> [CIFilter filterNamesInCategory:剛才拷貝的分類]; -> 打印出來的 是這個(gè)分類包含的所有 效果 -> 拷貝選擇其中的某一個(gè)效果.
2.查詢 使用的效果中 可以設(shè)置什么屬性(KVC) attributes
NSLog -> [CIFilter filterWithName:剛才拷貝選擇其中的某一個(gè)效果].attributes ->得到這個(gè)濾鏡所有可以設(shè)置的屬性
調(diào)用[CIFilter attributes]會(huì)返回filter詳細(xì)信息,

·CIContext

CIContext又稱上下文用來渲染CIImage,將作用在CIImage上的濾鏡鏈應(yīng)用到原始的圖片數(shù)據(jù)中。

利用下面的語句得到處理后的圖片

    CIImage * resultImage = [sepiaTone valueForKey:@"outputImage"];
    CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
    UIImage * image = [UIImage imageWithCGImage:imageRef];

現(xiàn)在我們大概了解過了CoreImage以及它的幾個(gè)常用類的概念。

現(xiàn)在實(shí)戰(zhàn)開始:

具體步驟:
1、導(dǎo)入CoreImage框架
2、創(chuàng)建CIImage對象
3、創(chuàng)建CIFilter
4、利用鍵值對設(shè)置CIFilter的各種屬性
5、獲得處理后的圖片
6、將得到的圖片渲染到視圖上

#import "ViewController.h"
#import <CoreImage/CoreImage.h>
//枚舉選擇是改變圖片的色調(diào)還是模糊度
typedef NS_ENUM(int,Stype) {
    ///舊色調(diào)
    SepiaTone =0,
    
    ///模糊設(shè)置
    GaussianBlur,
};

@interface ViewController ()

@property(nonatomic,retain)UISlider * slider;
@property(nonatomic,retain)UISegmentedControl * segmentControl;
@property(nonatomic,assign)Stype type;
@property(nonatomic,retain)UIImageView * imgView;
@property(nonatomic,retain)UIImage * image;
@property(nonatomic,retain)UIImageView * imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
    
    _image = [UIImage imageNamed:@"1.jpg"];
    _imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
    _imageView.userInteractionEnabled = YES;
    [_imageView setImage:_image];
    [self.view addSubview:_imageView];

    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(50,10,280,30)];
    label.text =@"先選中按鈕,再拖動(dòng)滑塊即可達(dá)到想要的效果";
    label.font = [UIFont systemFontOfSize:14.0];
    [_imageView addSubview:label];
    _slider = [[UISlider alloc]initWithFrame:CGRectMake(50,50,200,40)];
    _slider.maximumValue =1.0;
    _slider.minimumValue =0;
    _slider.continuous =YES;
    [_slider addTarget:self action:@selector(valueChange)forControlEvents:UIControlEventValueChanged];
    [_imageView addSubview:_slider];
    
    _segmentControl = [[UISegmentedControl alloc]initWithFrame:CGRectMake(100,80,120,40)];
    [_segmentControl insertSegmentWithTitle:@"舊色調(diào)"atIndex:0 animated:YES];
    [_segmentControl insertSegmentWithTitle:@"模糊設(shè)置"atIndex:1 animated:YES];
    [_segmentControl addTarget:self action:@selector(ButtonAction)forControlEvents:UIControlEventValueChanged];
    self.navigationItem.titleView = _segmentControl;
 
   }

-(void)ButtonAction
{
    switch (_segmentControl.selectedSegmentIndex) {
        case 0:
        {
            self.type =SepiaTone;//舊色調(diào)
        }
            break;
            
        default:
        {
            self.type =GaussianBlur;//模糊設(shè)置
        }
            break;
    }
}
-(void)valueChange
{
    switch (self.type) {
        case SepiaTone:
        {
            //舊色調(diào)
            [self filterSepiaTone];
        }
            break;
            
        default:
        {
            //模糊設(shè)置
            [self filterGaussianBlur];
        }
            break;
    }
}
//舊色調(diào)處理
-(void)filterSepiaTone
{
    //創(chuàng)建CIContext對象(默認(rèn)值,傳入nil)
    CIContext * context = [CIContext contextWithOptions:nil];
    //獲取圖片
    CIImage *cimage = [CIImage imageWithCGImage:[_image CGImage]];
    //創(chuàng)建CIFilter
    CIFilter * sepiaTone = [CIFilter filterWithName:@"CISepiaTone"];
    //設(shè)置濾鏡輸入?yún)?shù)
    [sepiaTone setValue:cimage forKey:@"inputImage"];
    
    //獲取滑塊的Value,設(shè)置色調(diào)強(qiáng)度
    [sepiaTone setValue:[NSNumber numberWithFloat:[_slider value]]forKey:@"inputIntensity"];
    //創(chuàng)建處理后的圖片
    CIImage * resultImage = [sepiaTone valueForKey:@"outputImage"];
    CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
   UIImage * image = [UIImage imageWithCGImage:imageRef];
    [_imageView setImage:image];
    CFRelease(imageRef);
}
//模糊設(shè)置處理
-(void)filterGaussianBlur
{
    
    //創(chuàng)建CIContext對象
    CIContext * context = [CIContext contextWithOptions:nil];
    //獲取圖片
    CIImage * image = [CIImage imageWithCGImage:[_image CGImage]];
    //創(chuàng)建CIFilter
    CIFilter * gaussianBlur = [CIFilter filterWithName:@"CIGaussianBlur"];
    //設(shè)置濾鏡輸入?yún)?shù)
    [gaussianBlur setValue:image forKey:@"inputImage"];
    //設(shè)置模糊參數(shù)
    [gaussianBlur setValue:[NSNumber numberWithFloat:_slider.value*10] forKey:@"inputRadius"];
    
    //得到處理后的圖片
    CIImage* resultImage = [gaussianBlur valueForKey:@"outputImage"];
    CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
    UIImage * image = [UIImage imageWithCGImage:imageRef];
    [_imageView setImage:imge];
    CFRelease(imageRef);
    
}
@end

設(shè)置模糊度和色調(diào)的方法里面有重復(fù)代碼,有興趣的話可以自己封裝一下,精簡代碼量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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