拿自己之就学经验和我们享用一下,Image的机能来诸多栽

前日中午微信的仇人围在实火了千篇一律管,在顿时事后多程序员都因此抓包工具看到了原图,不过自己倒是于想念,网上说是在运动前端做到的那么是怎就的也,经过一些念,终于领悟了一些Core
Image的学识,做出了对应的功能,仅仅十行代码

图片 1

 UIImageView * imgView = [[UIImageView alloc]init];
    imgView.frame = CGRectMake(50, 50, 200, 200);
    [self.view addSubview:imgView];
    UIImage * img = [UIImage imageNamed:@"Result.png"];
    CIImage * inputImg = [CIImage imageWithCGImage:img.CGImage];
    CIContext * context = [CIContext contextWithOptions:nil];
    //在这里设置Core Image的相应效果
    CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey,inputImg,@"inputRadius",@20, nil];
    CIImage * outPutImg = [filter outputImage];
    CGImageRef outImage = [context createCGImage:outPutImg fromRect:[outPutImg extent]];
    UIImage * newImg = [UIImage imageWithCGImage:outImage];
    NSLog(@"%@",newImg);
    imgView.image = newImg;

**效果Filter:CIPageCurlWithShadowTransition**

上述单独是Core Image的一模一样种植效应,而Core
Image的机能有成百上千栽,要想纯运用还得更加的学习,
提供下边的同样栽找到任何意义的道

勒索了好短期才拿 CIFilter
大部分之滤镜敲起得了(就是奇,也看看效果啥的)。也即使是属同一所有敲起一边读书。(为接触CIFilter的时候从不设想到主线程的题材,所以仍旧在drawrect中描绘的。性能不佳,也非思给你们看自己敲的事物了,自己扣在都醒着写的哟东西)正好有此空子,把自之学习经历和我们享受一下,大家好少走弯路。大家并学
Core Imgae (**
就当是无事了然一下吗是好的哎**),走及同一长不“归路”……

-(void)showAllFilter
{
    NSArray * filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
    for(NSString * filterName in filterNames)
    {
        CIFilter * filter  = [CIFilter filterWithName:filterName];
        NSLog(@"\r filter:%@ \rattributes:%@",filterName,[filter attributes]);

    }

}

目录

同桌等可自行学习并搭配以啊。

1.写在"CIFilter"前边关于"Core Image"的基础知识
2.那些你应该知道常用"CIFilter"滤镜
3."CIFilter"中的重要矩阵——"卷积矩阵"
4.在"CIFilter"中的一些小技巧

Core Image 基础知识

#首先 —— 我们要明白,当我们操作 || 改变 Image 的时候,我们其实操作的是DATA数据`
如果我们需要将图片转换为Data数据类型。那么我们可以这样做:

UIImage *tempImage = [UIImage imageNamed:@"test_new"];
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(tempImage.CGImage));
#ps:打印这个数据 " <0c71a5ff 0c70a5ff 0d71a5ff 0c71a5ff 
                0c71a5ff 0c71a5ff 0c71a5ff 0c71a5ff 0c71a5ff 0c71a5ff>"
随便截取一段打印的数据,每一个item代表一个颜色:"R-G-B-A".
了解了这个:"**图片某像素颜色的抓取** && **图片颜色RGBA进行矩阵修改**"那就看起来就容易多了。

#当然你还要注意的就是 UIImage | CGImage | CIImage 之间的区别
其实归结到底,他们只是不同的框架下得产物,同样也正因为不同的框架,使得他们的操作发生了质的变化。
•UIImage : 负责UIKit中的图片展示&数据管理。(CPU计算)
•CGImage: CoreGraphic中对图片的"旋转、缩放 & 挖取"工作。(GPU计算)
•CIImage : 描述一个如何产生一个图像,但其本身本身并不包含图像数据,  
           它代表的是图像数据或者生成图像数据的流程(如"滤镜的输出")
#Core Image 的优势:
最大化利用其所运行之上的硬件的。每个滤镜实际上的实现,即-"内核",是由一个
GLSL(即 OpenGL 的着色语言) 的子集来书写的.当多个滤镜连接成一个滤镜图表,
Core Image 便把内核串在一起来构建一个可在 GPU 上运行的高效程序
"事实上,图像处理和渲染就是将渲染到窗口的像素点进行许多的浮点运算,"
"那么GPU (图形处理器) 可以高效的完成。"

Core Image 概述

图片 2

屏幕快照 2016-10-25 深夜10.44.33.png

Core Image 是 iOS 5 新加入到 iOS 平台的一个图像处理框架,提供了强大高效的图像处理功能, 
用来对基于像素的图像进行操作与分析, 内置了很多强大的滤镜(Filter) (目前数量超过了180种), 
这些Filter 提供了各种各样的效果, 并且还可以通过 "滤镜链" 将各种效果的 Filter叠加起来
形成强大的自定义效果。~

IOS8随后一发支撑由定义Filter

•自动图像增强技术支持
•链接多个Filter,进行滤镜链
•"iOS8" 增强 GPU 渲染,在后台也能继续使用GPU处理。
•引入 CIDetector,提供一些常用的图片识别功能:人脸识别、条形码识别、文本识别等。
•越来越多的框架结合:OpenGL ES . Metal . SceneKit . SpriteKit
•iOS10 也对Core Image 有更新内容
#足可以看出 "Apple" 对 "Core Image" 的重视

Core Image 使用

**CIFilter 以起来特别简单 **

图片 3

下流程

CIFilter 基础类

•Core Image: 输入(可通过UIImage、图像文件和像素数据创建)&&输出图像
             数据(filter.outputImage方法获得)
•CIFilter: 应用的滤镜,通过键-值对 决定操作参数(可通过"[filter attributes]"查看
           参数的取值范围以及说明)
•CIContext: 表明上下文,通过CIContext绘制及渲染的CIImage图片数据,
            才会绘制成APP可以使用的图片

我们利用”CIConvolution3X3″举例

- (UIImage *)outputImageWithFilterName:(NSString *)filterName { 
  // 1. 获取source图片
  UIImage *inputOrigin = [UIImage imageNamed:@"histogram"];
  // 2. 创建滤镜 
  CIFilter *filter = [CIFilter filterWithName:filterNamekeysAndValues:kCIInputImageKey, ciImage, nil]; 
  // 设置相关参数 
  {
    CIImage *inputImage = [CIImage imageWithCGImage:inputOrigin.CGImage];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    CGFloat weights[] = {0,-1,0,
                        -1,5,-1,
                         0,-1,0};// 进行打磨处理
# MARK:- 使用卷积5X5矩阵的话, 这个可以实现重影效果"(3X3也可以,效果不好看)"
   //        CGFloat weights[] = {0.5,0,0,0,0,
   //                             0,0,0,0,0,
   //                             0,0,0,0,0,
   //                             0,0,0,0,0,
   //                             0,0,0,0,0.5};//重影效果
    CIVector *inputWeights = [CIVector vectorWithValues:weights count:9];// count 必须与输入的一致
    [filter setValue:inputWeights forKey:kCIInputWeightsKey];
    [filter setValue:@0 forKey:kCIInputBiasKey];
  }
  // 3. 渲染并输出
  CIImage CIImage *outputImage = [self.filter outputImage];  
  // 4. 获取绘制上下文
  self.context = [CIContext contextWithOptions:nil];  
  // 5. 创建输出
  CGImage CGImageRef cgImage = [self.context createCGImage:outputImage fromRect:[outputImage extent]];
   UIImage *image = [UIImage imageWithCGImage:cgImage]; 
  // 6. 释放
  CGImage CGImageRelease(cgImage);  
  return image;
}
#输入参数: inputImage . inputWeights . inputBias
# ps: CIConvolution7X7 . CIConvolution9Horizontal . CIConvolution9Vertical
# "这里就涉及到卷积矩阵了。"

功效如下:

图片 4

屏幕快照 2016-10-25 上午3.32.56.png

常用的CIFilter

#CIConstantColorGenerator("生成纯色图片做背景用") | CICrop ("裁切图片") | 
#CISourceAtopCompositing("两张图进行合成-前景&背景")| CIQRCodeGenerator("二维码生成")
# CIGaussianBlur ("高斯模糊")| CIConvolution3X3 ("自定义卷积Kernel")
#CICheckerboardGenerator("棋盘样式") | CIStripesGenerator("格子布")
# CIColorCrossPolynomial("多项式交叉"这个比较麻烦。参数设置需要计算等等,但是可以很强大)

大抵项式交叉

图片 5

CIColorCrossPolynomial多项式总结规则

图片 6

差不多项式交叉能成功的机能


卷积矩阵(让我们去真相更加切近)

网上的牵线:每个Filter被称为Kernel
内核,一部分的基本指的即便是以此 卷积矩阵

图片 7

卷积矩阵的简练例子

#这里其实发生了: 
过滤器连续地读,从左至右,从上到下,内核动作区域的所有像素。
它通过相应的价值和增值结果内核乘以他们每个人的价值。
初始像素已经成为42:
(40*0)+(42*1)+(46*0)+(46*0)+(50*0)+(55*0)+(52*0)+(56*0)+(58*0)= 42
过滤器会进行copy图片,在副本上进行工作得出图形结果("作为初始像素向下移动一个像素")
#这个卷积矩阵可以实现多种效果:
  锐化 | 模糊 | 边缘检测 | 浮雕 ……

图片 8

屏幕快照 2016-10-25 早上3.24.43.png

有你应当了然之稍知识

# MARK:
1.UIImage 属性.CIImage 可能为nil。
  ps:只有UIImage基于CIImage创建的,才能通过.CIImage得到 <CIImage>
2.使用filter生成的图片并不是总能使用UIImage进行渲染
  ps:生成的图片.extent 可能会是 "infinite(无穷大)".这样的图片不会被渲染,
      需要进行CICrop进行裁切。
3.如果filter对图片进行放大等操作而且需要裁切的,那么他是通过"Center向四周放大的"
   那么或许图片的时候应该考虑到#裁切的范围补偿。

CIContext GPU & CPU 对我们处理图片的影响

在开创结果 UIImage 的时节,最简便的艺术就是是经 imageWithCIImage
来实现。这种处境下,不需要彰显的宣示CIContext,因为
imageWithCIImage 内部自行就了是手续。这让用 Core Image
更加的便民。当然,它吗引起了此外一个问题,每一趟都会师又创制一个
CIContext,然而 CIContext 的代价是怪强的。
以,CIContext 和 CIImage
对象是不可变的,在线程之间共享这多少个目的是安的。所以基本上个线程可以拔取以及一个
GPU 或者 CPU CIContext 对象来渲染 CIImage 对象。
故而选定 CIContext 是丰盛有必不可少的。这意味着,我们不应有使
imageWithCIImage 来生成 UIImage,而应当团结创建维护 CIContext。

 #建议频繁操作CIContext。可以建一个全局的变量去维护。(每个上下文中都是有缓存的,频繁创建就用不到 上下文中 的缓存,既浪费资源又浪费内存的消耗)

冲 GPU 的言辞,处理速度更快,因为以了 GPU 硬件的相优势。可以使用
OpenGLES 或者 Metal
来渲染图像,这种艺术CPU完全无当,应用程序的运作循环不相会受图像渲染之熏陶。
但 GPU
受压硬件纹理尺寸,而且要你的次第在后台继续处理及保留图片的话,那么需要使用
CPU,因为当 App 切换来后台状态时 GPU 处理会叫从断。使用 CPU 渲染的 iOS
会采用 GCD 来对图像举行渲染,这管了 CPU 渲染在多数景下还保险,比
GPU 渲染再爱用,可以当后台实现渲染过程。
综上,对于复杂的图像滤镜使用 GPU
更好,可是假诺在拍卖视频并保存文件,或保存照片及照片库中平日,为避程序上后台对图片保存造成影响,这时应选拔CPU 举行渲染。

创建CIContext

// 创建基于 CPU 的 CIContext 对象 (默认是基于 GPU,CPU 需要额外设置参数)
context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];
// 创建基于 GPU 的 CIContext 对象
context = [CIContext contextWithOptions: nil];
// 创建基于 GPU 的 CIContext 对象
EAGLContext *glcontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
context = [CIContext contextWithEAGLContext: glcontext];

用特别注意:

"contextWithOptions"方法 创建的 "context"并没有实时性能, 虽然渲染是在 "GPU" 上执行,
但是其输出的 "image" 是不能显示的,只有当其被复制回 "CPU" 存储器上时,才会被转成一个可被
显示的 "image" 类型,比如 UIImage。

按照GPUImage库的揣摸。 以<CISepiaTone> – **
模拟器的状态下**为例:

# CPU 耗时:"83.47 ms" —— "( 自己手动计算图片每个像素目标值 ,GPU进行绘制图片)"
# Core Image 耗时: "1217.52 ms"  —— "( 用CIFilter计算,生成CIImage对象进行绘制 )"
# GPUImage 耗时: "340.92 ms" —— "使用GPUImage库进行计算,GPU进行绘制图片"
ps:以上信息为单次计算,可能会有一些误差在里边。大体的时间比例是正确的

在此间不得不提醒我们弹指间:

通过上边的数据显示,说明:**Core Image** 生成图片是特别占用cpu的。
所以当我们进行 CIFilter 生成 UIimage 的时候,尽量不要放到主线程中操作。
当计算这个任务被加入主线程中,主线程是一个串行的队列,每个操作都会阻碍"主线程屏幕的刷新"  
#ps: 这个会造成卡顿的现象的。
#(顺带着该学习一下多线程了,小编这几天刚看完多线程。又准备去看动画去了推荐"UIDynamic")
# UIKit中的 "动力学引擎" -- 比较Apple原生的东西,看到效果还不错的。这要是都让咱自己写啊,怎么会有精力呢!
# 苹果的东西还是值得一学的。"妈妈再也不用担心我的学习了。"

唯恐CIFilter内容极其多未轻记住:

获取CIFilter-Names  :  [CIFilter filterNamesInCategory:nil]
获取当前Filter的输入参 : [filter inputKeys]
获取当前Filter的输出参数 : [filter outputKeys]
输入参数的attributes : [filter attributes]

这这这,小编就学会及时点东西。有甚书出无意的物,欢迎指教!

末段什么,小编依然牵记多努力学习,Core Image
仅仅是性质不来众而已。但咱仍然如疼她,因为apple自家的物。我们且使匡助—-(ios开发工作者)


可话说回来,不是还有 人脸识别 值得您上吧。

IOS10 图库 然而进入了 ** 人物 ** 的法力呢 。

苹果软件工程高级副总裁克雷格·费德里奇在演讲中表示,“先进计算机视觉”(Advanced Computer Vision)
是今年照片应用最大幅度的一次更新,因为苹果通过深度学习技术将人脸识别带到了 iPhone 身上。

相关文章