Входное изображение
UIImage основывается либо на базовом кварцевом изображении (может быть получено с помощью cgImage), либо на базовом базовом изображении (может быть получено из UIImage с помощью ciImage).
MTIImage предлагает конструкторы для обоих типов.
MTIContext
MTIContext должен быть инициализирован с устройством, которое можно получить, вызвав MTLCreateSystemDefaultDevice ().
Rendering
Рендеринг в пиксельный буфер не требуется.Мы можем получить результат, вызвав makeCGImage.
Тест
Я взял ваш исходный код выше и немного адаптировал его к вышеупомянутым пунктам.
Я также добавил второй UIImageView, чтобы увидеть результат фильтрации.Я также изменил насыщенность на 0, чтобы посмотреть, работает ли фильтр
Если задействованы графический процессор или шейдеры, имеет смысл тестировать на реальном устройстве, а не на симуляторе.
Результат выглядит следующим образом:
В верхней области вы видите исходный 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)
}
}
}