coreImage框架的简单利用必发365游戏官方网址,模糊效果汇总

CoreImage是iOS5中新插足的Objective-C的框架,提供了强硬高效的图像管理功能,用来对依靠像素的图像进行操作与深入分析。

  • 1.查询功效分类中带有哪些效果按住command 点击CIFilter 步入接口文件
    找到第128行-148行全是 效果分类
  • 2.取舍中间某三个分拣拷贝NSLog -> [CIFilter
    filterNamesInCategory:刚才拷贝的分类]; -> 打字与印刷出来的
    是其一分类包涵的持有效能 -> 拷贝接纳之中的某贰个效果
  • 3.询问利用的机能中可以安装哪些属性 attributesNSLog -> [CIFilter
    filterWithName:刚才拷贝选用在那之中的某三个职能].attributes
    ->获得那么些滤镜全体能够安装的特性

近来对图像处理方面包车型大巴事物相比感兴趣,刚雅观了CoreImage这些壮大的图像管理框架,上边就跟我们大快朵颐一下。

介绍

介绍

先是,先通晓一下CoreImage这么些框架以及当中常用的多少个类:

CoreImage是IOS5中新加盟的多少个Objective-c的框架,里面提供了有力高效的图像管理作用,用来对基于像素的图像实行操作与深入分析。IOS提供了众多强有力的滤镜(Filter),那些Filter提供了三种三种的效应,而且还足以通过滤镜链将各个功效的Filter叠加起来,变成强劲的自定义效果,假诺您对该意义不满足,仍是能够子类化滤镜。

1).CoreImage2).是一个图像框架 他是基于OpenGL顶层创建 底层则用着色器来处理图像3).他利用GPU基于硬件加速处理图像4).CoreImage 中有很多滤镜5).它们能够一次给予一张图像或者视频帧多种视觉效果 -> 滤镜链6).而且滤镜可以连接起来组成一个滤镜链 把滤镜效果叠加起来处理图像
  • 1.框架介绍CoreImage是二个图像框架 它根据OpenGL顶层创立底层则用着色器来拍卖图像它选取了GPU基于硬件加速来处理图像CoreImage中有众多滤镜它们能够一遍给予一张图像也许录制帧种种视觉效果
    -> 滤镜链何况滤镜能够连接起来组成叁个滤镜链
    把滤镜效果叠合起来处理图像
  • 2.类的牵线CIImage:保存图像数据的类
    CGImageRef->图像中的数据.CIFilter:滤镜类
    图片属性进行细节管理的类 它对富有的像素进行操作用键-值来设置.CIContext:上下文是落实对图像管理的有血有肉指标 ->
    滤镜对象输出的图像并不是合成之后的图像
    供给使用图像管理的上下文合併管理的图像
  • 3.效用介绍
  • 按功用分类:kCICategoryDistortionEffect
    扭曲作用,譬如bump、旋转、holekCICategoryGeometryAdjustment
    几何开着调度,比方仿射转变、平切、透视调换kCICategoryCompositeOperation
    合併,举个例子源覆盖(source over)、最小化、源在顶(source
    atop)、色彩混合情势kCICategory哈尔ftoneEffect
    哈尔ftone效果,比方screen、line
    screen、hatchedkCICategoryColorAdjustment
    色广东汉剧节,比方伽马调度、白点调解、暴露kCICategoryColorEffect
    色彩效果,比方色调调节、posterizekCICategoryTransition
    图像间转移,举例dissolve、disintegrate with
    mask、swipekCICategoryTileEffect
    瓦片效果,比如parallelogram、trianglekCICategoryGenerator
    图像生成器,举个例子stripes、constant
    color、checkerboardkCICategoryGradient
    渐变,比方轴向渐变、仿射渐变、高斯渐变kCICategoryStylize
    风格化,比方像素化、水晶化kCICategorySharpen 锐化、发光
  • kCICategoryBlur 模糊,举例高斯模糊、主旨模糊、运动模糊
  • 按使用景况分类:kCICategoryStillImage 用于静态图像kCICategoryVideo
    用于录像kCICategoryInterlaced 用于交错图像kCICategoryNonSquarePixels
    用于非矩形像素kCICategoryHighDynamicRange 用于HDENCORE
· CIImage

是保留图像数据的类,它有各个相比常用的伊始化形式:

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

也足以因而图像数据类比如UIImage,CGImageRef等等开头化。

1. CoreImage框架

CoreImage框架中最中央代表图像的对象。保存图像数据的类,可以通过UIImage,图像文件或然像素数量创立。创造类情势如下:

imageWithContentsOfURL: imageWithData:imageWithCGImage:imageWithCVPixelBuffer:

1.实例CIImage -> 先把UIImage -> CGImageRef ->
CIImage2.创立CIFilter滤镜并给滤镜设置属性3.开立CIContext上下文4.开头化四个CGImageRef
输出图片对象
合并滤镜输出的图像5.赋给UIImage对象进行展现6.如若想行使滤镜链
能够重复增添效果

· CIFilter

滤镜类,这几个框架中对图纸属性举行细节管理的类。滤镜使用键-值来安装输入值,一旦这个值设置好,CIFilter就足以用来生成新的CIImage输出图像了。它的开头化一般用:

CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur"];           
2. CIFilter类

CIFilter类肩负图片属性进行细节处理的类

功能分类:

kCICategoryDistortionEffect 扭曲效果,比如bump、旋转、holekCICategoryGeometryAdjustment 几何开着调整,比如仿射变换、平切、透视转换kCICategoryCompositeOperation 合并,比如源覆盖(source over)、最小化、源在顶(source atop)、色彩混合模式kCICategoryHalftoneEffect Halftone效果,比如screen、line screen、hatchedkCICategoryColorAdjustment 色彩调整,比如伽马调整、白点调整、曝光kCICategoryColorEffect 色彩效果,比如色调调整、posterizekCICategoryTransition 图像间转换,比如dissolve、disintegrate with mask、swipe kCICategoryTileEffect 瓦片效果,比如parallelogram、trianglekCICategoryGenerator 图像生成器,比如stripes、constant color、checkerboardkCICategoryGradient 渐变,比如轴向渐变、仿射渐变、高斯渐变kCICategoryStylize 风格化,比如像素化、水晶化 kCICategorySharpen 锐化、发光kCICategoryBlur 模糊,比如高斯模糊、焦点模糊、运动模糊

按使用处境分类

kCICategoryStillImage 用于静态图像 kCICategoryVideo 用于视频 kCICategoryInterlaced 用于交错图像 kCICategoryNonSquarePixels 用于非矩形像素 kCICategoryHighDynamicRange 用于HDR

效果如下:

必发365游戏官方网址 11.png

1. 优点: 模糊效果较好,模糊程度的可调范围很大,可以根据实际的需求随意调试。2. 缺点: 耗时3. 需要导入: #import <CoreImage/CoreImage.h>

步骤

1.实例CIImage—>UIImage—>CGImageRef —> CIImage2.创建CIFilter滤镜并给滤镜设置属性3.创建CIContext上下文4.合并滤镜输出的图像 ->得到一个合并之后的图像 5.赋给UIImageView对象进行显示

代码如下:

ViewController* __block blockSelf = self; dispatch_async(dispatch_get_global_queue, ^{ UIImage *sourceImage = [UIImage imageNamed:@"test"]; CIContext *context = [CIContext contextWithOptions:nil]; //CIImage CIImage *ciImage = [[CIImage alloc] initWithImage:sourceImage]; //过滤器<有很多种, 在下边打印的有> CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; //将图片输入到滤镜中 [blurFilter setValue:ciImage forKey:kCIInputImageKey]; //设置模糊程度 [blurFilter setValue:@ forKey:@"inputRadius"]; NSLog(@"查看blurFilter的属性--- %@",blurFilter.attributes); //将处理之后的图片输出 CIImage *outCIImage = [blurFilter valueForKey:kCIOutputImageKey]; /** 获取CGImage句柄 * createCGImage: 处理过的CIImage * fromRect: 如果从处理过的图片获取frame会比原图小, 因此在此需要设置为原始的CIImage.frame */ CGImageRef outCGImageRef = [context createCGImage:outCIImage fromRect:[ciImage extent]]; //获取到最终图片 UIImage *resultImage = [UIImage imageWithCGImage:outCGImageRef]; //释放句柄 CGImageRelease(outCGImageRef); dispatch_async(dispatch_get_main_queue(), ^{ blockSelf.imageView.image = resultImage; }); });

iOS
8
后,苹果开放了非常多创制特效的接口,其中就总结成立毛玻璃的接口。

想创制多个特殊效果,能够创设三个UIVisualEffectView视图对象,那几个目的提供了一种轻便的办法来贯彻复杂的视觉效果。那么些能够把那些目的看作是成效的二个容器,实际的成效会耳濡目染到充足到该视图对象的contentView中的内容。

UIVisualEffect是三个接续自NSObject的创导视觉效果的基类,从不提供别的新的性质和措施。其重大目标是用来初叶化UIVisualEffectView,在那一个初叶化方法中能够流传UIBlurEffect或者UIVibrancyEffect对象。

第一利用的类/差异/注意事项:

1. UIBlurEffect对象用于将blur效果应用于UIVisualEffectView视图下面的内容。**只有三种枚举值**2. UIVibrancyEffect: 主要用于放大和调整UIVisualEffectView视图下面的内容的颜色;让contentView中的内容看起来更加生动;3. 尽量避免将UIVisualEffectView对象的alpha值设置为小于1.0的值,因为创建半透明的视图会导致系统在离屏渲染时去对UIVisualEffectView对象及所有的相关的子视图做混合操作。这不但消耗CPU/GPU,也可能会导致许多效果显示不正确或者根本不显示。

成效如下

必发365游戏官方网址 22.png

代码如下

- useEffect:sender { self.imageView.image = [UIImage imageNamed:@"2"]; // Blur effect 模糊效果 UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; blurEffectView.frame = CGRectMake(50, 30, self.imageView.frame.size.width - 100, self.imageView.frame.size.height - 60); [self.imageView addSubview:blurEffectView]; // Vibrancy effect 生动效果<根据背景图实时调整文字颜色> UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect]; UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect]; vibrancyEffectView.frame = CGRectMake(50, 30, self.imageView.frame.size.width - 100, self.imageView.frame.size.height - 60); // 添加vibrancy view 到 blur view的contentView上 [blurEffectView.contentView addSubview:vibrancyEffectView]; // 效果字体 UILabel *label = [[UILabel alloc] init]; label.text = @"UIVibrancyEffect"; label.font = [UIFont systemFontOfSize:28.0f]; [label sizeToFit]; label.frame = CGRectMake(10, 10, 200, 60); // 添加label到the vibrancy view的contentView上 [vibrancyEffectView.contentView addSubview:label]; }

利用storyboard

详尽请看UIVisualEffectView实现高斯模糊效果(stroyboar和纯代码)

必发365游戏官方网址 3显示屏快照2015-08-12 凌晨10.40.44.png

前去苹果官方文书档案下载UIImage+ImageEffects.h/.m文本, 导入工程;

必发365游戏官方网址 43.png

代码如下

//苹果推出的框架- useEffects:sender { //模糊区域 self.imageView.image = [[UIImage imageNamed:@"test"] blurImageAtFrame:CGRectMake(0.0, 0.0, 155.0*2 , 235.0*4.0)]; //全部模糊 //self.imageView.image = [[UIImage imageNamed:@"test"] blurImage]; // self.imageView.image = [[UIImage imageNamed:@"test"] blurImageWithMask:[UIImage imageNamed:@"2"]];}

UIView的子类FXBlurView, 来达成模糊效果

必发365游戏官方网址 54.png

- useFXBlurView:sender { FXBlurView *fxView = [[FXBlurView alloc] initWithFrame:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)]; //动态 fxView.dynamic = NO; //模糊范围 fxView.blurRadius = 10; //背景色 fxView.tintColor = [UIColor clearColor]; [self.imageView addSubview:fxView]; }

效果与利益图如下:

必发365游戏官方网址 65.png

GPUImage是用设备的GPU来实时管理图片,给图片摄像加种种滤镜效果的三个开源库,
太牛逼的叁个框架, 以为用在此处有些扣壶长吟了….

 ViewController* __block blockSelf = self; dispatch_async(dispatch_get_global_queue, ^{ // 高斯模糊 GPUImageGaussianBlurFilter * blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; blurFilter.blurRadiusInPixels = 10; UIImage *blurImage = [blurFilter imageByFilteringImage:[UIImage imageNamed:@"test"]]; dispatch_async(dispatch_get_main_queue(), ^{ blockSelf.imageView.image = blurImage; }); }); 

Demo详见github

参考

1.运用UIVisualEffectView为视图增多特殊效果2.UIVisualEffectView兑现高斯模糊效果(stroyboar和纯代码)3.CoreImage

更加的多优秀内容请关心“IT实战缔盟”哦~~~

必发365游戏官方网址 7IT实战联盟.jpg

代码示例:#import “ViewController.h”//宏定义 显示器的宽#define
SCREEN_WIDTH CGRectGetWidth([UIScreen mainScreen].bounds)

上边是询问供给的滤镜种类的方法:

1.查询 效果分类中 包罗怎么样遵从:filterNamesInCategory:
(1)按住command 点击CIFilter 步入接口文件 找到第128行-148行全部是效果分类
(2)采取当中某二个分拣 NSLog -> [CIFilter
filterNamesInCategory:刚才拷贝的分类]; -> 打字与印刷出来的
是这一个分类包涵的装有 效果 -> 拷贝选拔中间的某三个效果.
2.查询 使用的作用中 能够安装哪些性质(KVC) attributes
NSLog -> [CIFilter
filterWithName:刚才拷贝选拔之中的某三个成效].attributes
->获得那么些滤镜全体能够安装的特性
调用[CIFilter attributes]会回去filter详细音讯,

 //注意挂上代理 @interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate> { UIImageView *myImageView;//接收图片的视图 UIButton *photoButton;//从本地相册选择图片的按钮 UIButton *filterButton;//添加滤镜的按钮 UIButton *saveButton;//滤镜后保存到本地相册的按钮 } @end @implementation ViewController - viewDidLoad { [super viewDidLoad]; //去除导航栏的高度 self.edgesForExtendedLayout = UIRectEdgeNone; //设置背景色 self.view.backgroundColor = [UIColor greenColor]; // 创建按钮 NSArray *titleButtonList = @[@"photo",@"Filter",@"save"]; for (int i=0; i<titleButtonList.count; i++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(20+80*i, 20, 60, 40); [button setTitle:titleButtonList[i] forState:UIControlStateNormal]; button.tag = 10 +i ; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; button.backgroundColor = [UIColor cyanColor]; [self.view addSubview:button]; } // 初始化图片视图 myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, SCREEN_WIDTH-40, 300)]; myImageView.backgroundColor = [UIColor cyanColor]; [self.view addSubview:myImageView]; photoButton = [self.view viewWithTag:10]; filterButton = [self.view viewWithTag:11]; saveButton = [self.view viewWithTag:12]; // 给三个按钮添加触发事件 [photoButton addTarget:self action:@selector(photoAction:) forControlEvents:UIControlEventTouchUpInside]; // 滤镜按钮 [filterButton addTarget:self action:@selector(filterAction:) forControlEvents:UIControlEventTouchUpInside]; //保存滤镜后图片的按钮 [saveButton addTarget:self action:@selector(saveAction:) forControlEvents:UIControlEventTouchUpInside]; } //选择图片 - photoAction:(UIButton *)sender{ UIImagePickerController *pickerController = [[UIImagePickerController alloc]init]; pickerController.delegate = self; [self presentViewController:pickerController animated:YES completion:nil]; } //把图片放在图片视图上 - imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ UIImage *image = info[UIImagePickerControllerOriginalImage]; myImageView.image = image; [self dismissViewControllerAnimated:YES completion:nil]; } //滤镜按钮的触发方法 - filterAction:(UIButton *)sender{ // 1.源图 CIImage *inputImage = [CIImage imageWithCGImage:myImageView.image.CGImage]; // 2.滤镜 CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"]; // NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryColorEffect]);//注意此处两个输出语句的重要作用 NSLog(@"%@",filter.attributes); [filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:[CIColor colorWithRed:1.000 green:0.165 blue:0.176 alpha:1.000] forKey:kCIInputColorKey]; CIImage *outImage = filter.outputImage; [self addFilterLinkerWithImage:outImage]; } //再次添加滤镜 形成滤镜链 - addFilterLinkerWithImage:(CIImage *)image{ CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; [filter setValue:image forKey:kCIInputImageKey]; [filter setValue:@ forKey:kCIInputIntensityKey]; // 在这里创建上下文 把滤镜和图片进行合并 CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef resultImage = [context createCGImage:filter.outputImage fromRect:filter.outputImage.extent]; myImageView.image = [UIImage imageWithCGImage:resultImage]; } //保存滤镜后的图片到本地相册 - saveAction:(UIButton *)sender{ UIImageWriteToSavedPhotosAlbum(myImageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } //保存成功调用的方法 - image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:contextInfo{ NSLog; } @end
·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

安装模糊度和颜色的形式里面有再次代码,有野趣的话能够友善包装一下,精简代码量。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website