最近对图像处理方面的东西比较感兴趣,刚好看了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
//枚举选择是改变图片的色调还是模糊度
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
设置模糊度和色调的方法里面有重复代码,有兴趣的话可以自己封装一下,精简代码量。