iOS滤镜功能

一、iOS自带滤镜

1.CoreImage

使用苹果自带的CoreImage框架对图片进行处理,用CoreImage框架里的CIFilter对图片进行滤镜处理,

首先我们应该了解下CoreImage框架能够对图像进行那些处理和拥有哪些特效。

苹果给我们提供了将近200中滤镜效果

// 这里我们可以看到总共有多少种滤镜

 NSArray *filterNames = [CIFilter filterNamesInCategory:@"CICategoryBuiltIn"];            NSLog(@"总共有%ld种滤镜效果:%@",filterNames.count,filterNames);

    //以一个具体分类中的滤镜信息

    NSArray* filters =  [CIFilter filterNamesInCategory:kCICategoryDistortionEffect];

    for (NSString* filterName in filters) {

        NSLog(@"filter name:%@",filterName);

        // 我们可以通过filterName创建对应的滤镜对象

        CIFilter* filter = [CIFilter filterWithName:filterName];

        NSDictionary* attributes = [filter attributes];

        // 获取属性键/值对(在这个字典中我们可以看到滤镜的属性以及对应的key)        NSLog(@"filter attributes:%@",attributes);

    }

然后我们还可以进入苹果iOS官方文档中具体看看效果到底是什么样子的Core Image Filter Reference

可以看到CoreImage中的CIFilter效果确实很多,分很多种类别,每个分类中又有多个效果

2.滤镜怎么实现

CoreImage框架提供三个API来实现滤镜效果

CIContext:核心API,来管理所有的图片处理操作。

CIFilter:过滤器,通过在创建CIFilter时需要传入不同的参数即可创建不同类型的过滤器。

CIImage:它代表 Core Image 过滤器处理的图片,CIFilter过滤器的输入图片,输出图片都由该CIImage代表。

CIContext:创建分三种方式,因为采用基于GPU的CIContext将可以获得更好的性能,因此,

一般建议创建基于GPU的CIContext,但基于GPU的CIContext对象无法跨应用访问,这个问题需要注意

 //1.创建基于CPU的CIContext对象
 self.context = [CIContext contextWithOptions:
    [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
 forKey:kCIContextUseSoftwareRenderer]];

    //2.创建基于GPU的CIContext对象
 self.context = [CIContext contextWithOptions: nil];

    //3.创建基于OpenGL优化的CIContext对象,可获得实时性能
self.context = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]];

// 将UIImage转换成CIImage
    CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"WechatIMG1.jpeg"]];
    // 创建滤镜
    CIFilter *filter = [CIFilter filterWithName:_dataSourse[indexPath.row]
                                  keysAndValues:kCIInputImageKey, ciImage, nil];
    [filter setDefaults];

    // 获取绘制上下文
    CIContext *context = [CIContext contextWithOptions:nil];
    // 渲染并输出CIImage
    CIImage *outputImage = [filter outputImage];
    // 创建CGImage句柄
    CGImageRef cgImage = [self.context createCGImage:outputImage
                                      fromRect:[outputImage extent]];
    imageview.image = [UIImage imageWithCGImage:cgImage];
    // 释放CGImage句柄
    CGImageRelease(cgImage);

二、GPUImage实现滤镜

1. GPUImage

GPUImage是现在做滤镜最主流的开源框架,没有之一。作者BradLarson基于openGL对图片处理单元进行封装,

提供出GPUImageFilter基类,配合shader,常用滤镜都拿下不是问题。

1.1、安装(请参考这个 https://www.jianshu.com/p/4d419a88ecce

(1):首先下载GPUImagehttps://github.com/BradLarson/GPUImage

(2):解压后,在framework 目录下,打开 GPUImage.xcodeproj  工程

下载完成打开文件有件

2、GPUImage的使用

使用GPUImage自带的滤镜,GPUImage自带的滤镜有很多种这里举例一种

 GPUImageBrightnessFilter *disFilter = [[GPUImageBrightnessFilter alloc] init];
        //设置美白参数
        disFilter.brightness = 0.2;
        //设置要渲染的区域
        [disFilter forceProcessingAtSize:image.size];

        [disFilter useNextFrameForImageCapture];

        //获取数据源
        GPUImagePicture *stillImageSource = [[GPUImagePicture alloc]initWithImage:image];

        //添加上滤镜
        [stillImageSource addTarget:disFilter];

        //开始渲染
        [stillImageSource processImage];
        //获取渲染后的图片
        UIImage *newImage = [disFilter imageFromCurrentFramebuffer];
        return newImage;

另外就是根据纹理自定义滤镜来处理图片,纹理图片可有设计提供,另外纹理的叠加还需要研究

#import "GPUImageTwoInputFilter.h"

#import "GPUImage.h"

NS_ASSUME_NONNULL_BEGIN

@interface DhGPUImageQingXinFilter : GPUImageTwoInputFilter

@end
@interface GPUImageQingXinFilter : GPUImageFilterGroup
{
    GPUImagePicture *imageSource ;
    GPUImagePicture *imageSource2 ;
}
@end
NS_ASSUME_NONNULL_END
#import "DhGPUImageQingXinFilter.h"

#import "GPUImageLookupFilter.h"
#import "GPUImageFilter.h"
//自定义shader

NSString *const GPUImageQingXinFilterString = SHADER_STRING
(
 precision lowp float;

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2;
 void main()
 {

     vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb;

     texel = vec3(
                  texture2D(inputImageTexture2, vec2(texel.r, .16666)).r,
                  texture2D(inputImageTexture2, vec2(texel.g, .5)).g,
                  texture2D(inputImageTexture2, vec2(texel.b, .83333)).b);
     gl_FragColor = vec4(texel, 1.0);
 }
 );

@implementation DhGPUImageQingXinFilter
- (id)init;
{
    if (!(self = [super initWithFragmentShaderFromString:GPUImageQingXinFilterString]))
    {
        return nil;
    }

    return self;
}
@end

@implementation GPUImageQingXinFilter

- (id)init
{
    if (!(self = [super init]))
    {
        return nil;
    }
    //  清新

    UIImage *image2 = [UIImage imageNamed:@"camera_filter_overlay_map.png"];
    UIImage *image = [UIImage imageNamed:@"camera_filter_sierra_map"];

    imageSource = [[GPUImagePicture alloc] initWithImage:image];
    DhGPUImageQingXinFilter *filter = [[DhGPUImageQingXinFilter alloc] init];

    [self addFilter:filter];

    [imageSource addTarget:filter atTextureLocation:1];
    [imageSource processImage];

    imageSource2 = [[GPUImagePicture alloc] initWithImage:image2];
    DhGPUImageQingXinFilter *filter2 = [[DhGPUImageQingXinFilter alloc] init];
    [filter addTarget:filter2];
    [imageSource2 addTarget:filter2];
    [imageSource2 processImage];
    [self addFilter:filter2];

    self.initialFilters = [NSArray arrayWithObjects:filter, nil];
    self.terminalFilter = filter;

    return self;
}
- (void)dealloc
{
#if !OS_OBJECT_USE_OBJC
    if (imageCaptureSemaphore != NULL)
    {
        dispatch_release(imageCaptureSemaphore);
    }
#endif

}
@end

原文地址:https://www.cnblogs.com/ljcgood66/p/11521077.html

时间: 2024-10-07 03:31:58

iOS滤镜功能的相关文章

iOS直播功能总结

一.直播原理及流程 1.一个完整直播app原理 直播原理:把主播录制的视频,推送到服务器,在由服务器分发给观众观看. 直播环节:推流端(采集.美颜处理.编码.推流).服务端处理(转码.录制.截图.鉴黄).播放器(拉流.解码.渲染).互动系统(聊天室.礼物系统.赞) 2.直播app实现流程 1.采集.2.滤镜处理.3.编码.4.推流.5.CDN分发.6.拉流.7.解码.8.播放.9.聊天互动 直播流程.png 3.直播app架构 直播架构.png 4.直播app技术点 二.直播基础知识介绍: 1.

iOS滤镜 和 ios6中的CoreImage技术

Core Image是一个很强大的框架. 它可以让你简单地应用各种滤镜来处理图像,比如修改鲜艳程度, 色泽, 或者曝光. 它利用GPU(或者CPU,取决于客户)来非常快速.甚至实时地处理图像数据和视频的帧. 多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重滤镜效果.这种多重滤镜的优点在于它可以生成一个改进的滤镜,从而一次性的处理图像达到目标效果,而不是对同一个图像顺序地多次应用单个滤镜.每一个滤镜都有属于它自己的参数.这些参数和滤镜信息,比如功能.输入参数等都可以通过程序来查

只需 4 步,手把手教你如何实现滤镜功能

源地址:http://zihua.li/2014/06/implement-instagram-like-filters/ 滤镜对于照片而言,起到的是雪中送炭和锦上添花的作用.优秀的滤镜,能让随手之作显得别有风味,又能为已经绝色的照片画龙点睛.现在几乎凡是和照片相关的应用程序都有滤镜功能,而相较而言介绍滤镜原理和实现的文章又少之又少,为此我专门写了这篇文章来系统地讲解滤镜是如何实现的. 什么是滤镜 滤镜最初是指安装在相机镜头前过滤自然光的附加镜头,用来实现调色和添加效果.一些数字图像处理软件(最

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件

iOS 常用功能

iOS 调用短信.电话.邮件.浏览器等 功能调用ios 调用系统发短信以及打电话功能 iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话) ZYPopoverView https://github.com/zyfrog/ZYPopoverView iOS 常用功能

转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理定位,就是获取当前精度.纬度和地理位置的功能,这一部分功能主要用到CoreLocation.Frameworks.一部分就是显示地图信息.丰富地图内容等,这一部分主要用到MapKit.Frameworks.以上这几个功能的测试最好都要在真机上进行.模拟器上定位一般会在Apple的加州总部. 首先介绍

IOS滤镜

IOS 自带coreImage CIFilter 共有100多种滤镜效果,官方只介绍了一种,找不到中文介绍,下面是其中一部分中文介绍  CIAdditionCompositing     //影像合成 CIAffineTransform           //仿射变换 CICheckerboardGenerator       //棋盘发生器 CIColorBlendMode              //CIColor混合模式 CIColorBurnBlendMode          //

iOS Simulator功能介绍关于Xamarin IOS开发

iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPhone或iPad设备时,可以使用iOS Simulator对程序进行检测本文选自Xamarin iOS开发实战. iOS Simulator可以模仿真实的iPhone或iPad等设备的功能各种功能,如表1-3所示. 表1-3  iOS Simulator 在表1-3所示的功能中需要注意,iOS Si

如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能

Cocos2d-x作为一款优秀的跨平台游戏引擎,已经被越来越多的开发者使用,而在游戏中使用分享组件能够有效的提供用户粘性,通过分享回流来提高APP安装量,但是目前市面上能够在Cocos2d-x环境下使用的分享插件并不多,开发者们只能自己对原生分享SDK进行封装来实现,前一段时间友盟推出Cocos2d-x分享组件,能够帮助开发者快速集成.友盟也把组件的源码放在GitHub上,有好的想法也可以直接在GitHub上修改(PS.在GitHub上提bug可以获得友盟的小奖品),同样也可以对源码进行学习,对