渲染一个 MTIImage

Swi*_*yle 1 ios swift metal

请不要评判我,我只是在学习 Swift。

最近我安装了 MetalPetal 框架,并按照说明进行操作:

https://github.com/MetalPetal/MetalPetal#example-code

但是由于 MTIContext 出现错误。也许我必须声明更多的 MetalPetal?

我的代码:

我的代码

import UIKit
import MetalPetal
import CoreGraphics

class ViewController: UIViewController {

    @IBOutlet weak var image1: UIImageView!
    override func viewDidLoad() {

        super.viewDidLoad()




        weak var image: UIImage?
        image = image1.image
        var ciImage = CIImage(image: image!)
        var cgImage1 = convertCIImageToCGImage(inputImage: ciImage!)
        let imageFromCGImage = MTIImage(cgImage: cgImage1!)


        let inputImage = imageFromCGImage
        let filter = MTISaturationFilter()
        filter.saturation = 1
        filter.inputImage = inputImage

        let outputImage = filter.outputImage


        let context = MTIContext()

        do {
            try context.render(outputImage, to: pixelBuffer)

            var image3: CIImage? = try context.makeCIImage(from: outputImage!)

            //context.makeCIImage(from: image)

            //context.makeCGImage(from: image)
        } catch {
            print(error)
        }





        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
        let context = CIContext(options: nil)
        if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) {
            return cgImage
        }
        return nil
    }

}
Run Code Online (Sandbox Code Playgroud)

@YuAo

Ste*_*cht 5

输入图像

UIImage 基于底层 Quartz 图像(可以使用 cgImage 检索)或底层 Core Image(可以使用 ciImage 从 UIImage 检索)。

MTIImage 为这两种类型都提供了构造函数。

上下文

MTIContext 必须使用可通过调用 MTLCreateSystemDefaultDevice() 检索的设备进行初始化。

渲染

不需要渲染到像素缓冲区。我们可以通过调用 makeCGImage 得到结果。

测试

我已经采用了上面的源代码,并根据上述几点稍微调整了它。

我还添加了第二个 UIImageView 来查看过滤的结果。我还将饱和度更改为 0 以查看过滤器是否有效

如果涉及 GPU 或着色器,则在真实设备上而不是在模拟器上进行测试是有意义的。

结果如下所示:

饱和测试

在上部区域中,您会看到原始 jpg,在下部区域中应用了过滤器。

迅速

生成此结果的简化 Swift 代码如下所示:

override func viewDidLoad() {

    super.viewDidLoad()

    guard let image = UIImage(named: "regensburg.jpg") else { return }
    guard let cgImage = image.cgImage else { return }

    imageView1.image = image

    let filter = MTISaturationFilter()
    filter.saturation = 0
    filter.inputImage = MTIImage(cgImage: cgImage)

    if let device = MTLCreateSystemDefaultDevice(),
        let outputImage = filter.outputImage {
        do {
            let context = try MTIContext(device: device)
            let filteredImage = try context.makeCGImage(from: outputImage)
            imageView2.image = UIImage(cgImage: filteredImage)
        } catch {
            print(error)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)