iOS技术资料iOS开发部落OpenGL

GPUImage详细解析(四)模糊图片处理

2016-05-31  本文已影响4240人  落影loyinglin

回顾

解析(一)
解析(二)
解析(三)
这次介绍的GPUImageContextGPUImageFramebufferCacheGPUImagePicture

GPUImageContext

GPUImageContext是GPUImage对OpenGL ES上下文的封装,添加了GPUImage相关的上下文,比如说Program的使用缓存,处理队列,CV纹理缓存等。

1、属性介绍

contextQueue 统一处理队列
currentShaderProgram 正在使用的program
context OpenGL ES的上下文
coreVideoTextureCache CV纹理缓存
framebufferCache GPUImageBuffer缓存
shaderProgramCache Program的缓存
shaderProgramUsageHistory Program的使用历史

2、方法介绍

GPUImageFramebufferCache

GPUImageFramebufferCache是GPUImageFrameBuffer的管理类

1、属性介绍

CacheframebufferCache 缓存字典
framebufferTypeCounts 缓存数量字典
activeImageCaptureList 正在读取Image数据的GPUImageFrameBuffer列表
framebufferCacheQueue 缓存队列

2、方法介绍

GPUImagePicture

GPUImagePicture是PGUImage的图像处理类,继承GPUImageOutput,一般作为响应链的源头。

1、属性介绍

pixelSizeOfImage 图像的像素大小。
hasProcessedImage 图像是否已处理。
imageUpdateSemaphore 图像处理的GCD信号量。

2、方法介绍

DEMO

用GPUImagePicture处理源图像,用GPUImageTiltShiftFilter处理模糊效果,用GPUImageView显示。

效果展示

核心代码

将GPUImageView设置为self.view,根据face.png,设置GPUImagePicture,然后添加GPUImageTiltShiftFilter到响应链,再把GPUImageView作为响应链的终点,最后调用processImage,开始处理图像。

    GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:self.view.frame];
    self.view = primaryView;
    UIImage *inputImage = [UIImage imageNamed:@"face.png"];
    _sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage];
    _sepiaFilter = [[GPUImageTiltShiftFilter alloc] init];
    _sepiaFilter.blurRadiusInPixels = 40.0;
    [_sepiaFilter forceProcessingAtSize:primaryView.sizeInPixels];
    [_sourcePicture addTarget:_sepiaFilter];
    [_sepiaFilter addTarget:primaryView];
    [_sourcePicture processImage];

总结

最近因为直播用户增长太快,忙着优化原来的逻辑,研读源代码的时间变少。
同时为了写这篇文章,查了一些关于图像资料,末尾附上。
下一篇文章可能会介绍今年大火的直播APP的一种速成方案,也可能会是GPUImageMovie的介绍。
喜欢的点一下关注,不迷路。

MIPMAP

Mipmap纹理技术是目前解决纹理分辨率与视点距离关系的最有效途径,它会先将图片压缩成很多逐渐缩小的图片,例如一张6464的图片,会产生6464,3232,1616,88,44,22,11的7张图片,当屏幕上需要绘制像素点为2020 时,程序只是利用 3232 和 1616 这两张图片来计算出即将显示为 2020 大小的一个图片,这比单独利用 32*32 的那张原始片计算出来的图片效果要好得多,速度也更快.

图像数据格式

kCGImageAlphaLast:alpha 分量存储在每个像素中的低位,如RGBA。
kCGImageAlphaFirst:alpha 分量存储在每个像素中的高位,如ARGB。
kCGImageAlphaPremultipliedLast:alpha 分量存储在每个像素中的低位,同时颜色分量已经乘以了 alpha 值。
kCGImageAlphaPremultipliedFirst:alpha 分量存储在每个像素中的高位,同时颜色分量已经乘以了 alpha 值。
kCGImageAlphaNoneSkipLast:没有 alpha 分量。如果像素的总大小大于颜色空间中颜色分量数目所需要的空间,则低位将被忽略。
kCGImageAlphaNoneSkipFirst:没有 alpha 分量。如果像素的总大小大于颜色空间中颜色分量数目所需要的空间,则高位将被忽略。

图像颜色空间

上一篇下一篇

猜你喜欢

热点阅读