coreImage框架的简单使用

最近对图像处理方面的东西比较感兴趣,刚好看了CoreImage这个强大的图像处理框架,下面就跟大家分享一下。

首先,先了解一下CoreImage这个框架以及其中常用的几个类:

CoreImage是IOS5中新加入的一个Objective-c的框架,里面提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。IOS提供了很多强大的滤镜(Filter),这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果不满意,还可以子类化滤镜。

· CIImage

是保存图像数据的类,它有四种比较常用的初始化方式:

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

也可以通过图像数据类比如UIImage,CGImageRef等等初始化。

· CIFilter

滤镜类,这个框架中对图片属性进行细节处理的类。滤镜使用键-值来设置输入值,一旦这些值设置好,CIFilter就可以用来生成新的CIImage输出图像了。它的初始化一般用:

CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur"];           
下面是查询需要的滤镜种类的方法:

1.查询 效果分类中 包含什么效果:filterNamesInCategory:
(1)按住command 点击CIFilter 进入接口文件 找到第128行-148行全部都是 效果分类
(2)选择其中某一个分类 NSLog -> [CIFilter filterNamesInCategory:刚才拷贝的分类]; -> 打印出来的 是这个分类包含的所有 效果 -> 拷贝选择其中的某一个效果.
2.查询 使用的效果中 可以设置什么属性(KVC) attributes
NSLog -> [CIFilter filterWithName:刚才拷贝选择其中的某一个效果].attributes ->得到这个滤镜所有可以设置的属性
调用[CIFilter attributes]会返回filter详细信息,

·CIContext

CIContext又称上下文用来渲染CIImage,将作用在CIImage上的滤镜链应用到原始的图片数据中。

利用下面的语句得到处理后的图片

    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];

现在我们大概了解过了CoreImage以及它的几个常用类的概念。

现在实战开始:

具体步骤:
1、导入CoreImage框架
2、创建CIImage对象
3、创建CIFilter
4、利用键值对设置CIFilter的各种属性
5、获得处理后的图片
6、将得到的图片渲染到视图上

#import "ViewController.h"
#import <CoreImage/CoreImage.h>
//枚举选择是改变图片的色调还是模糊度
typedef NS_ENUM(int,Stype) {
    ///旧色调
    SepiaTone =0,
    
    ///模糊设置
    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 =@"先选中按钮,再拖动滑块即可达到想要的效果";
    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:@"旧色调"atIndex:0 animated:YES];
    [_segmentControl insertSegmentWithTitle:@"模糊设置"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;//旧色调
        }
            break;
            
        default:
        {
            self.type =GaussianBlur;//模糊设置
        }
            break;
    }
}
-(void)valueChange
{
    switch (self.type) {
        case SepiaTone:
        {
            //旧色调
            [self filterSepiaTone];
        }
            break;
            
        default:
        {
            //模糊设置
            [self filterGaussianBlur];
        }
            break;
    }
}
//旧色调处理
-(void)filterSepiaTone
{
    //创建CIContext对象(默认值,传入nil)
    CIContext * context = [CIContext contextWithOptions:nil];
    //获取图片
    CIImage *cimage = [CIImage imageWithCGImage:[_image CGImage]];
    //创建CIFilter
    CIFilter * sepiaTone = [CIFilter filterWithName:@"CISepiaTone"];
    //设置滤镜输入参数
    [sepiaTone setValue:cimage forKey:@"inputImage"];
    
    //获取滑块的Value,设置色调强度
    [sepiaTone setValue:[NSNumber numberWithFloat:[_slider value]]forKey:@"inputIntensity"];
    //创建处理后的图片
    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);
}
//模糊设置处理
-(void)filterGaussianBlur
{
    
    //创建CIContext对象
    CIContext * context = [CIContext contextWithOptions:nil];
    //获取图片
    CIImage * image = [CIImage imageWithCGImage:[_image CGImage]];
    //创建CIFilter
    CIFilter * gaussianBlur = [CIFilter filterWithName:@"CIGaussianBlur"];
    //设置滤镜输入参数
    [gaussianBlur setValue:image forKey:@"inputImage"];
    //设置模糊参数
    [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

设置模糊度和色调的方法里面有重复代码,有兴趣的话可以自己封装一下,精简代码量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容