zoukankan      html  css  js  c++  java
  • iOS-CoreImage简单使用

    CoreImage是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像。 CoreImage中有很多滤镜,它们能够一次给予一张图像或者视频帧多种视觉效果。而且滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像。

    CoreImage框架最常用的类:


    * CIImage

    保存图像数据的类,可以通过UIImage,图像文件或者像素数据来创建,包括未处理的像素数据如:

    - imageWithCVPixelBuffer:

    - imageWithData:

    方法等等。

    也可以通过图像数据类比如UIImage,CGImageRef等等。


    * CIFilter

    滤镜类,这个框架中对图片属性进行细节处理的类。它对所有的像素进行操作,用一些键-值设置来决定具体操作的程度。


    * CIContext

    上下文类,如CoreGraphics以及CoreData中的上下文用于处理绘制渲染以及处理托管对象一样,CoreImage的上下文也是实现对图像处理的具体对象。

    这里需要注意的是在Context创建的时候,我们需要给它设定为是基于GPU还是CPU。(这里使用GPU)

    基于GPU的话,处理速度更快,因为利用了GPU硬件的并行优势。但是GPU受限于硬件纹理尺寸,而且如果你的程序在后台继续处理和保存图片的话,那么需要使用CPU,因为当app切换到后台状态时GPU处理会被打断。

    使用步骤:

    0.导入CIImage图片

        CIImage *ciImage = [[CIImage alloc]initWithImage:[UIImage imageNamed:@"test.jpg"]];

    1.创建出Filter滤镜

        CIFilter *filterOne = [CIFilter filterWithName:@"CIPixellate"];
        [filterOne setValue:ciImage forKey:kCIInputImageKey];
        [filterOne setDefaults];

        CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];

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

        CIContext *context = [CIContext contextWithOptions:nil];
        
        CGImageRef cgImage = [context createCGImage:outImage fromRect:[outImage extent]];

    3.导出图片

        UIImage *showImage = [UIImage imageWithCGImage:cgImage];
        CGImageRelease(cgImage);

    4.加载图片

       _image.image = showImage;

     如果要使用组合滤镜

    在步骤1中设置组合滤镜,只需要将上一个滤镜的输出变为下一个滤镜的输入就行了

        //第一个滤镜
        CIFilter *filterOne = [CIFilter filterWithName:@"CIPixellate"];
        [filterOne setValue:ciImage forKey:kCIInputImageKey];
        [filterOne setDefaults];
        CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];
        //第二个滤镜
        CIFilter *filterTwo = [CIFilter filterWithName:@"CIHueAdjust"];
        [filterTwo setValue:outImage forKey:kCIInputImageKey];
        [filterTwo setDefaults];
        [filterTwo setValue:@(1.f) forKey:kCIInputAngleKey];
        CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];

     记住渲染的时候,步骤2,要将最后输出的CIImage传入

        CIContext *context = [CIContext contextWithOptions:nil];
        
        CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outImage extent]];

  • 相关阅读:
    小问题也是大问题
    Java GC(2)
    Java GC(1)
    mac eclipse svn
    svn merge
    LTE,WiMAX与WIFI相关知识链接整理
    【LTE基础知识】承载相关概念介绍
    【LTE基础知识】LTE空口协议分析
    LTE基础知识
    Scapy学习2
  • 原文地址:https://www.cnblogs.com/hxwj/p/4663225.html
Copyright © 2011-2022 走看看