ios - 渲染 MTIImage
问题描述
请不要评判我,我只是在学习 Swift。
最近我安装了 MetalPetal 框架并按照说明进行操作:
但是由于 MTIContext,我得到了错误。也许我必须声明更多的金属花瓣?
我的代码:
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 检索)或底层核心图像(可以使用 ciImage 从 UIImage 检索)。
MTIImage 为这两种类型提供了构造函数。
MTI上下文
必须使用可以通过调用 MTLCreateSystemDefaultDevice() 检索的设备来初始化 MTIContext。
渲染
不需要渲染到像素缓冲区。我们可以通过调用 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)
}
}
}
推荐阅读
- ruby-on-rails - Rails act_as_votable 使用 AJAX 停止页面重新加载
- excel - 如何在其工作表范围之外调用 ActiveX 过程?
- azure-functions - 从 Azure 函数发布到自定义端口
- c++ - Write IMU data to csv file using buffer and overflow buffer?
- aws-lambda - 嵌套 JSON 对象应如何从 CloudFormation 传递到 Lambda 函数?
- javascript - 尝试通过单击事件侦听器使用 Javascript 更改显示样式
- python - 如何对具有相同列和行的值求和
- python - 以下代码中的 * 符号是什么意思?
- css - rmagick 裁剪的图像在 Safari 的底部有黑条
- c++ - 如何从 C++ 中的一组数字中获得最大的整数?