zoukankan      html  css  js  c++  java
  • CoreImage 处理图片

    1.CoreImage 滤镜的使用(马赛克模糊)

    CoreImage是苹果公司为了简化图片处理的难度而开发出来的类库。

    随着iOS版本号升级以及硬件性能的不断提升,CoreImage将支持越来越多的滤镜

    - (void)hFilter {

        // 0. 导入CIImage图片

        CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@"demo"]];

        

        // 1. 创建出Filter滤镜

        CIFilter *filter = [CIFilterfilterWithName:@"CIPixellate"];

        

        [filtersetValue:ciImage

                 forKey:kCIInputImageKey];

        

        NSLog(@"%@", filter.attributes);

        

        [filtersetDefaults];

        

        CIImage *outImage = [filter valueForKey:kCIOutputImageKey];

        

        // 2. CIContext将滤镜中的图片渲染出来

        CIContext *context = [CIContextcontextWithOptions:nil];

        

        CGImageRef cgImage = [context createCGImage:outImage

                                           fromRect:[outImage extent]];

        

        // 3. 导出图片

        UIImage *showImage = [UIImageimageWithCGImage:cgImage];

        

        CGImageRelease(cgImage);

        

        // 4. 载入出来

        UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

        imageView.center       =self.view.center;

        [self.viewaddSubview:imageView];

    }


    2.CoreImage 滤镜的组合

    不同的滤镜能够组合在一起使用。

    能够动态的改动滤镜组合中单个滤镜的參数来实现一种动态调整的效果

    - (void)complexCoreImage {

        // 0. 导入CIImage图片

        CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@"demo"]];

        

        // 1. 创建出Filter滤镜

        CIFilter *filterOne = [CIFilterfilterWithName:@"CIPixellate"];

        

        [filterOnesetValue:ciImage

                    forKey:kCIInputImageKey];

        

        [filterOnesetDefaults];

        

        CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];

        

        CIFilter *filterTwo = [CIFilterfilterWithName:@"CIHueAdjust"];

        [filterTwosetValue:outImage

                    forKey:kCIInputImageKey];

        

        [filterTwosetDefaults];

        //默觉得0,不设置不能改变。能够封装一个调用

        [filterTwosetValue:@(3.14)

                    forKey:kCIInputAngleKey];

        NSLog(@"%@",filterTwo.attributes);//能够看到一些參数 key

        

        CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];

        

        // 2. CIContext将滤镜中的图片渲染出来

        CIContext *context = [CIContextcontextWithOptions:nil];

        

        CGImageRef cgImage = [context createCGImage:outputImage

                                           fromRect:[outImage extent]];

        

        // 3. 导出图片

        UIImage *showImage = [UIImageimageWithCGImage:cgImage];

        

        CGImageRelease(cgImage);

        

        // 4. 载入出来

        UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

        imageView.center       =self.view.center;

        [self.viewaddSubview:imageView];

    }



    3. OpenGLES 下进行渲染

    OpenGLES下进行滤镜的渲染能够提高效率。(GPU渲染,不占用CPU

                             假设须要实时查看多个滤镜动态渲染的效果,使用OpenGLES是一个好的选择

    #import <GLKit/GLKit.h>

           

     @interface ViewController ()

     @property (nonatomic,strong) GLKView   *glkView;// 渲染用的buffer视图

     @property (nonatomic,strong) CIFilter  *filter;

     @property (nonatomic,strong) CIImage   *ciImage;

     @property (nonatomic,strong) CIContext *ciContext;

     

     @end

     

     @implementation ViewController


     - (void)viewDidLoad {

         [superviewDidLoad];


      UIImage *showImage = [UIImageimageNamed:@"demo"];

      CGRect  rect       = CGRectMake(0, 0, showImage.size.width, showImage.size.height);

      

      // 获取OpenGLES渲染的上下文

      EAGLContext *eagContext = [[EAGLContextalloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

      

      // 创建出渲染的buffer

      _glkView = [[GLKViewalloc] initWithFrame:rect

                                       context:eagContext];

      [_glkViewbindDrawable];

      [self.viewaddSubview:_glkView];

      

      // 创建出CoreImage用的上下文

      _ciContext = [CIContextcontextWithEAGLContext:eagContext

                                            options:@{kCIContextWorkingColorSpace : [NSNullnull]}];


      // CoreImage相关设置

      _ciImage = [[CIImagealloc] initWithImage:showImage];

      

      _filter = [CIFilterfilterWithName:@"CISepiaTone"];

      

      [_filtersetValue:_ciImageforKey:kCIInputImageKey];

      [_filtersetValue:@(0)forKey:kCIInputIntensityKey];

      

      // 開始渲染

      [_ciContextdrawImage:[_filteroutputImage]

                    inRect:CGRectMake(0,0, _glkView.drawableWidth,_glkView.drawableHeight)

                  fromRect:[_ciImageextent]];

      [_glkViewdisplay];

      

      // 动态渲染

      UISlider *slider    = [[UISlideralloc] initWithFrame:CGRectMake(0,400, 320, 20)];

        slider.minimumValue =0.f;

        slider.maximumValue =1.f;

        [slider addTarget:selfaction:@selector(sliderEvent:)forControlEvents:UIControlEventValueChanged];

        [self.viewaddSubview:slider];

    }


    - (void)sliderEvent:(UISlider *)slider {

        [_filtersetValue:_ciImageforKey:kCIInputImageKey];

        [_filtersetValue:@(slider.value)

                  forKey:kCIInputIntensityKey];

        

        // 開始渲染

        [_ciContextdrawImage:[_filteroutputImage]

                      inRect:CGRectMake(0,0, _glkView.drawableWidth,_glkView.drawableHeight)

                    fromRect:[_ciImageextent]];

        [_glkViewdisplay];

    }

                             

             


  • 相关阅读:
    Codeforces 294B Shaass and Bookshelf:dp
    Codeforces 372B Counting Rectangles is Fun:dp套dp
    Codeforces 402D Upgrading Array:贪心 + 数学
    Codeforces 571B Minimization:dp + 贪心【前后相消】
    Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】
    codeforces 447E or 446C 线段树 + fib性质或二次剩余性质
    类斐波那契数列的一些性质
    CF 1097D
    最近点对问题
    2018ACM-ICPC EC-Final 现场赛I题 Misunderstanding...Missing 倒着DP
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5411354.html
Copyright © 2011-2022 走看看