zoukankan      html  css  js  c++  java
  • iOS给图片添加滤镜&使用openGLES动态渲染图片

    给图片增加滤镜有这两种方式: CoreImage / openGLES

    下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤:

    #1.导入CIImage格式的原始图片

    #2.创建CIFilter滤镜

    #3.用CIContext将滤镜中的图片渲染出来

    #4.导出渲染后的图片

    参考代码:

     1   //导入CIImage
     2     CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"hua"]];
     3     
     4     //创建出Filter滤镜
     5     CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
     6     
     7     [filter setValue:ciImage forKey:kCIInputImageKey];
     8     
     9     [filter setDefaults];
    10     
    11     CIImage *outImage = [filter valueForKey:kCIOutputImageKey];
    12     
    13     //用CIContext将滤镜中的图片渲染出来
    14     CIContext *context = [CIContext contextWithOptions:nil];
    15     
    16     CGImageRef cgImage = [context createCGImage:outImage
    17                                        fromRect:[outImage extent]];
    18     
    19     //导出图片
    20     UIImage *showImage = [UIImage imageWithCGImage:cgImage];
    21     
    22     CGImageRelease(cgImage);
    23     
    24     UIImageView *imageView = [[UIImageView alloc] initWithImage:showImage];
    25     imageView.center       = self.view.center;
    26     [self.view addSubview:imageView];

    滤镜有哪些可选可以参看以下文章:http://www.jianshu.com/p/3e2cca585ccc

    当要设置多个滤镜的时候, 出了新创建一个CIFilter外还要额外设定kCIInputAngleKey, 代码如下:

     1 //导入CIImage
     2     CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"hua.jpeg"]];
     3     
     4     //创建出Filter滤镜
     5     CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
     6     
     7     [filter setValue:ciImage forKey:kCIInputImageKey];
     8     
     9     [filter setDefaults];
    10     
    11     CIImage *outImage = [filter valueForKey:kCIOutputImageKey];
    12     
    13     CIFilter *filterTwo = [CIFilter filterWithName:@"CIHueAdjust"];
    14     
    15     [filterTwo setValue:outImage forKey:kCIInputImageKey];
    16     
    17     [filterTwo setDefaults];
    18     
    19     [filterTwo setValue:@(1.0f) forKey:kCIInputAngleKey]; //如果不增加这行新增的滤镜不会生效
    20     
    21     CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];
    22     
    23     //用CIContext将滤镜中的图片渲染出来
    24     CIContext *context = [CIContext contextWithOptions:nil]; 
    25     
    26     CGImageRef cgImage = [context createCGImage:outputImage
    27                                        fromRect:[outputImage extent]];
    28     
    29     //导出图片
    30     UIImage *showImage = [UIImage imageWithCGImage:cgImage];
    31     
    32     CGImageRelease(cgImage);
    33     
    34     UIImageView *imageView = [[UIImageView alloc] initWithImage:showImage];
    35     imageView.center       = self.view.center;
    36     [self.view addSubview:imageView];

    下面来介绍怎么用openGLES来使用滤镜渲染图片

    使用openGlES的步骤大致如下:

    #1.导入要渲染的图片

    #2.获取OpenGLES渲染的上下文

    #3.创建出渲染的GLKView buffer

    #4.创建CoreImage的上下文

    #5.进行CoreImage的相关设置

    #6.开始渲染并显示图片

    参考代码如下:

     1 //导入要渲染的图片
     2     UIImage *showImage = [UIImage imageNamed:@"hua.jpeg"];
     3     CGRect rect        = CGRectMake(0, 0, showImage.size.width, showImage.size.height);
     4     
     5     //获取OpenGLES渲染的上下文
     6     EAGLContext *eagContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
     7     
     8     //创建出渲染的buffer
     9     GLKView *glkView = [[GLKView alloc] initWithFrame:rect
    10                                               context:eagContext];
    11     [glkView bindDrawable];
    12     [self.view addSubview:glkView];
    13     
    14     //创建出CoreImage的上下文
    15     CIContext *ciContext = [CIContext contextWithEAGLContext:eagContext
    16                                                      options:@{kCIContextWorkingColorSpace: [NSNull null]}];
    17     
    18     //CoreImage相关设置
    19     CIImage *ciImage = [[CIImage alloc] initWithImage:showImage];
    20     
    21     CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
    22     
    23     [filter setValue:ciImage forKey:kCIInputImageKey];
    24     [filter setValue:@(0) forKey:kCIInputIntensityKey];
    25     
    26     //开始渲染
    27     [ciContext drawImage:[filter valueForKey:kCIOutputImageKey]
    28                   inRect:CGRectMake(0, 0, glkView.drawableWidth, glkView.drawableHeight)
    29                 fromRect:[ciImage extent]];
    30     
    31     [glkView display];

    如果要动态渲染, 可以通过UISilder动态调整一下代码的vaule值

    [filter setValue:vaule forKey:kCIInputIntensityKey];
  • 相关阅读:
    ConcurrentSkipListMap 源码分析
    ConcurrentHashMap 源码分析
    CopyOnWriteArrayList 源码分析
    AtomicBoolean 源码分析
    commons-lang3-3.4.jar
    Effective Java
    FindBugs Bug Descriptions
    EasyMock
    Apache Maven 入门
    Eclipse
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/6011725.html
Copyright © 2011-2022 走看看