gpt4 book ai didi

ios - 渲染 MTIImage

转载 作者:行者123 更新时间:2023-11-28 10:40:08 29 4
gpt4 key购买 nike

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

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

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

但是由于 MTIContext,我得到了错误。也许我必须声明更多关于 MetalPetal 的内容?

我的代码:

My Code

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
}

}

@YuAo

最佳答案

输入图像

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

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

MTI上下文

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

渲染

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

测试

我已经获取了上面的源代码,并根据上述要点对其进行了微调。

我还添加了第二个 UIImageView 以查看过滤结果。我也把饱和度改成0看看滤镜能不能用

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

结果是这样的:

saturation test

在上部区域您可以看到原始 jpg,在下部区域可以看到应用了滤镜的图像。

swift

生成此结果的简化 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)
}
}
}

关于ios - 渲染 MTIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51025323/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com