滤镜:可以用来给图像添加效果。功能很强大,使用滤镜很容易对图像、视频帧进行模糊、色彩、像素等处理
介绍
1、框架:
1)使用CoreImage框架【现在已经不需要手动导入,因为系统已经完成】
2)是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像
3)它利用GPU基于硬件加速来处理图像
4)CoreImage中有很多滤镜
5)它们能够一次给予一张图片或视频帧多种视觉效果【叫做滤镜链】
6)滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像
滤镜链:滤镜的嵌套组合使用
2、类:
1)CIImage:用于保存图像数据的类;
CGImageRef:图像中的数据
2)CIFilter:滤镜类,根据图片属性进行细节处理的类。它对所有像素进行操作,用键-值(KVC)来设置
3)CIContext:上下文,是实现对图像处理的具体对象 ——>滤镜对象输出的图像并不是和成之后的图像,需要使用图像处理的上下文合并输出的图像
3、效果:
【100+效果可以通过CIFilter的属性attributes查找需要设置的参数内容】
1)按效果分类:
kCICategoryDistortionEffect 扭曲效果,比如bump、旋转、hole
kCICategoryGeometryAdjustment 几何开着调整,比如仿射变换、平切、透视转换
kCICategoryCompositeOperation 合并,比如源覆盖(source over)、最小化、源在顶(source atop)、色彩混合模式
kCICategoryHalftoneEffect Halftone效果,比如screen、line screen、hatched
kCICategoryColorAdjustment 色彩调整,比如伽马调整、白点调整、曝光
kCICategoryColorEffect 色彩效果,比如色调调整、posterize
kCICategoryTransition 图像间转换,比如dissolve、disintegrate with mask、swipe
kCICategoryTileEffect 瓦片效果,比如parallelogram、triangle
kCICategoryGenerator 图像生成器,比如stripes、constant color、checkerboard
kCICategoryGradient 渐变,比如轴向渐变、仿射渐变、高斯渐变
kCICategoryStylize 风格化,比如像素化、水晶化
kCICategorySharpen 锐化、发光
kCICategoryBlur 模糊,比如高斯模糊、焦点模糊、运动模糊
2)按使用场景分类:
kCICategoryStillImage 用于静态图像
kCICategoryVideo 用于视频
kCICategoryInterlaced 用于交错图像
kCICategoryNonSquarePixels 用于非矩形像素
kCICategoryHighDynamicRange 用于HDR
简单的使用
1、查询效果分类里面的效果[CIFilter filterNamesInCategory:@""];
(1)按住command键 点击CIFilter 进入接口文件 找到第128行-148行全部都是 效果分类
(2)选择其中某一个分类 NSLog -> [CIFilter filterNamesInCategory:刚才拷贝的分类]; -> 打印出来的 是这个分类包含的所有 效果 -> 拷贝选择其中的某一个效果
2、查询效果的属性[CIFilter filterWithName:XXX].attributes
NSLog -> [CIFilter filterWithName:刚才拷贝选择其中的某一个效果].attributes ->得到这个滤镜所有可以设置的属性
3、使用步骤
1)初始化CIImage:
2)创建CIFilter滤镜并给滤镜设置属性(KVC)
3)创建CIContext上下文
4)合并滤镜输出的图像——>得到一个合并之后的图像
5)赋值给UIImageView对象惊醒显示
6)如果要使用滤镜链,可以再次叠加效果
代码实例
#import "ViewController.h"
@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
UIImageView *imageView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
//添加一个进入相册的按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 40);
[button setTitle:@"进入相册" forState:UIControlStateNormal];
button.backgroundColor = [UIColor brownColor];
[button addTarget:self action:@selector(doit) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//添加滤镜按钮
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
button1.frame = CGRectMake(100, 150, 100, 40);
[button1 setTitle:@"Filter" forState:UIControlStateNormal];
button1.backgroundColor = [UIColor brownColor];
[button1 addTarget:self action:@selector(addColorFilter) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1];
}
使用滤镜进行颜色处理
-(void)addColorFilter{
CIImage *inputImage = [CIImage imageWithCGImage:imageView.image.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];
[filter setValue:inputImage forKey:kCIInputImageKey];
NSLog(@"颜色%@",[CIFilter filterNamesInCategory:kCICategoryColorEffect]);
NSLog(@"%@",filter.attributes);
[filter setValue:[CIColor colorWithRed:1.0 green:0.7262 blue:0.1014 alpha:1] forKey:kCIInputColorKey];
[filter setValue:@0.5 forKey:kCIInputIntensityKey];
// CIContext *context = [CIContext contextWithOptions:nil];
CIImage *outputImage = filter.outputImage;
// CGImageRef imageRef =[context createCGImage:outputImage fromRect:outputImage.extent];
// imageView.image = [UIImage imageWithCGImage:imageRef];
[self addFilterLinkerWithImage:outputImage];
}
//再次添加滤镜->滤镜链
-(void)addFilterLinkerWithImage:(CIImage*)image{
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:@0.5 forKey:kCIInputIntensityKey];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef imageRef = [context createCGImage:filter.outputImage fromRect:filter.outputImage.extent];
imageView.image = [UIImage imageWithCGImage:imageRef];
// 把添加好滤镜效果的图片 保存到相册【注意:不可以直接保存outputImage->因为这是一个没有吧滤镜效果和原图合成的图像】
UIImageWriteToSavedPhotosAlbum(imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
添加滤镜效果核心代码
-(void)addFilter{
//1.输入的源图->先得到CGImage,在得到CIImage
CIImage *inputImage = [CIImage imageWithCGImage:imageView.image.CGImage];
// 2.创建滤镜 并设置滤镜的效果
CIFilter *filter = [CIFilter filterWithName:@"CIBumpDistortion"];
// 给滤镜添加inputImage
[filter setValue:inputImage forKey:kCIInputImageKey];
//设置凹凸效果的半径,半径越大效果越明显
[filter setValue:@500 forKey:kCIInputRadiusKey];
// CIVector:表示x、y的坐标
[filter setValue:[CIVector vectorWithX:200 Y:200] forKey:kCIInputCenterKey];//设置中心点XY
// 3.合并 原图和滤镜的效果
CIImage *outPutImage = filter.outputImage;
// 创建图像操作的上下文
CIContext *context = [CIContext contextWithOptions:nil];
// 合成一个包含原图和滤镜效果的图像
// outPutImage.extent可以获得图像的尺寸
// 1.image -> 滤镜输出的图像
// 2.fromRect -> 合成之后图像的尺寸 :图像.extent
CGImageRef imageRef = [context createCGImage:outPutImage fromRect:outPutImage.extent];
imageView.image = [UIImage imageWithCGImage:imageRef];
}
进入相册获取源图的方法
-(void)doit{
UIImagePickerController *picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
// picker.sourceType = 可以设置是摄像还是相册
[self presentViewController:picker animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
//获得info中的image 并显示在imageView上
UIImage *image = info[UIImagePickerControllerOriginalImage];
imageView.image = image;
// 让相册消失
[self dismissViewControllerAnimated:YES completion:nil];
网友评论