GPUImage2 使用教程
项目介绍
GPUImage2 是一个 BSD 许可的 Swift 框架,用于在 Mac、iOS 和 Linux 上进行 GPU 加速的图像和视频处理。它是 GPUImage 框架的第二代,由 Brad Larson 开发。GPUImage2 提供了丰富的图像处理滤镜和视频处理功能,支持自定义滤镜和复杂的管线操作。
项目快速启动
安装 GPUImage2
首先,你需要通过 Cocoapods 安装 GPUImage2。在你的 Podfile 中添加以下内容:
pod 'GPUImage2'
然后执行以下命令进行安装:
pod install
使用 GPUImage2 处理静态图片
以下是一个简单的示例,展示如何使用 GPUImage2 处理静态图片并应用滤镜:
import GPUImage2
class StillImageViewController: UIViewController {
lazy var imageView: UIImageView = {
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
imageView.image = UIImage(contentsOfFile: Bundle.main.path(forResource: "hulu", ofType: "jpg")!)
imageView.contentMode = .scaleAspectFit
return imageView
}()
var filter: BasicOperation!
var pictureInput: PictureInput!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(imageView)
// 创建一个亮度调整滤镜
filter = BrightnessAdjustment()
filter.brightness = 0.2
// 加载图片并应用滤镜
pictureInput = PictureInput(image: imageView.image!)
pictureInput --> filter --> imageView
pictureInput.processImage()
}
}
应用案例和最佳实践
视频处理
GPUImage2 不仅支持静态图片处理,还支持视频处理。以下是一个简单的示例,展示如何使用 GPUImage2 处理视频并应用滤镜:
import GPUImage2
import AVFoundation
class VideoFilterViewController: UIViewController {
var videoCamera: Camera!
var filter: SaturationAdjustment!
var renderView: RenderView!
override func viewDidLoad() {
super.viewDidLoad()
// 创建摄像头输入
do {
videoCamera = try Camera(sessionPreset: .vga640x480, location: .backFacing)
videoCamera.runBenchmark = true
} catch {
videoCamera = nil
print("Could not initialize rendering camera: \(error)")
return
}
// 创建饱和度调整滤镜
filter = SaturationAdjustment()
filter.saturation = 1.5
// 创建渲染视图
renderView = RenderView(frame: self.view.bounds)
self.view.addSubview(renderView)
// 设置处理链
videoCamera --> filter --> renderView
videoCamera.startCapture()
}
}
自定义滤镜
GPUImage2 支持自定义滤镜,你可以根据自己的需求创建新的滤镜。以下是一个简单的示例,展示如何创建一个自定义滤镜:
import GPUImage2
class CustomFilter: BasicOperation {
public var threshold: Float = 0.5 { didSet { uniformSettings["threshold"] = threshold } }
public init() {
super.init(fragmentShader: CustomFragmentShader, numberOfInputs: 1)
({ threshold = 0.5 })()
}
}
let CustomFragmentShader = """
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform highp float threshold;
void main() {
highp vec4 color = texture2D(inputImageTexture, textureCoordinate);
highp float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(vec3(step(threshold, gray)), color.a);
}
"""