这个系列文章我们来介绍一位海外工程师如何探索 GPUImage 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 GPUImage 基本图像滤镜。
——来自公众号“关键帧Keyframe”的分享
GPUImage 利用 GPU 并行计算,可显著优于传统 CPU 处理。以下内容带你快速上手静态图片的滤镜应用。
1、准备工作:把图片载入管线
使用 GPUImagePicture作为输入源:
UIImage *inputImage = [UIImage imageNamed:@"sample.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
2、单滤镜应用
2.1、显式链式(适合后续扩展)
GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[stillImageSource addTarget:sepiaFilter];
[sepiaFilter useNextFrameForImageCapture]; // 保留输出供捕获
[stillImageSource processImage];
UIImage *filteredImage = [sepiaFilter imageFromCurrentFramebuffer];
2.2、一行搞定(简单场景)
GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
UIImage *filteredImage = [sepiaFilter imageByFilteringImage:inputImage];
3、常用内置滤镜速览
3.1、色彩调整
| 滤镜 | 功能 | 参数范围 | 默认值 |
|---|---|---|---|
GPUImageBrightnessFilter | 亮度 | –1.0 … 1.0 | 0.0 |
GPUImageContrastFilter | 对比度 | 0.0 … 4.0 | 1.0 |
GPUImageSaturationFilter | 饱和度 | 0.0 … 2.0 | 1.0 |
GPUImageExposureFilter | 曝光 | –10.0 … 10.0 | 0.0 |
示例:提亮 25 %
GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
brightnessFilter.brightness = 0.25;
UIImage *brightenedImage = [brightnessFilter imageByFilteringImage:inputImage];
3.2、视觉效果
| 滤镜 | 说明 | 主要参数 |
|---|---|---|
GPUImageSepiaFilter | 怀旧棕褐色 | intensity0–1 |
GPUImageGrayscaleFilter | 灰度图 | 无 |
GPUImageMonochromeFilter | 单色映射 | intensity0–1、RGB 颜色 |
GPUImageFalseColorFilter | 伪彩色 | 起始色、终止色 |
示例:80 % 蓝色单色
GPUImageMonochromeFilter *mono = [[GPUImageMonochromeFilter alloc] init];
mono.intensity = 0.8f;
mono.color = (GPUVector4){0.0f, 0.0f, 1.0f, 1.0f};
UIImage *blueMono = [mono imageByFilteringImage:inputImage];
4、多滤镜链式组合
GPUImagePicture *source = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageContrastFilter *contrast = [[GPUImageContrastFilter alloc] init];
contrast.contrast = 1.5;
GPUImageSepiaFilter *sepia = [[GPUImageSepiaFilter alloc] init];
sepia.intensity = 0.8;
[source addTarget:contrast];
[contrast addTarget:sepia];
[sepia useNextFrameForImageCapture];
[source processImage];
UIImage *filteredImage = [sepia imageFromCurrentFramebuffer];
处理管线:原图 → 对比度 → 棕褐色 → 结果。
5、显示与保存
5.1、显示
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = filteredImage;
[self.view addSubview:imageView];
5.2、保存
// 保存到系统相册
UIImageWriteToSavedPhotosAlbum(filteredImage, nil, nil, nil);
// 保存为 JPEG 到沙盒
NSData *jpeg = UIImageJPEGRepresentation(filteredImage, 0.8);
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) firstObject];
[jpeg writeToFile:[path stringByAppendingPathComponent:@"filtered.jpg"]
atomically:YES];
6、性能要点
iPhone 4 上简单滤镜可 快 100×于 CPU。
- 多滤镜链保持数据在 GPU,可进一步减少内存拷贝。
- 默认帧缓存自动复用,仅在
useNextFrameForImageCapture时保留输出,降低峰值内存。
7、小结
| 步骤 | 关键 API |
|---|---|
| 载入图片 | GPUImagePicture initWithImage: |
| 单滤镜 | imageByFilteringImage: |
| 链式滤镜 | addTarget:+ processImage |
| 捕获结果 | imageFromCurrentFramebuffer |
掌握以上基础后,即可进入实时视频滤镜的下一步学习。
学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。