Визуализация MTIImage - PullRequest
0 голосов
/ 25 июня 2018

Пожалуйста, не судите меня, я только учу Свифта.

Недавно я установил фреймворк 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

1 Ответ

0 голосов
/ 01 июля 2018

Входное изображение

UIImage основывается либо на базовом кварцевом изображении (может быть получено с помощью cgImage), либо на базовом базовом изображении (может быть получено из UIImage с помощью ciImage).

MTIImage предлагает конструкторы для обоих типов.

MTIContext

MTIContext должен быть инициализирован с устройством, которое можно получить, вызвав MTLCreateSystemDefaultDevice ().

Rendering

Рендеринг в пиксельный буфер не требуется.Мы можем получить результат, вызвав makeCGImage.

Тест

Я взял ваш исходный код выше и немного адаптировал его к вышеупомянутым пунктам.

Я также добавил второй UIImageView, чтобы увидеть результат фильтрации.Я также изменил насыщенность на 0, чтобы посмотреть, работает ли фильтр

Если задействованы графический процессор или шейдеры, имеет смысл тестировать на реальном устройстве, а не на симуляторе.

Результат выглядит следующим образом:

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)
        }
    }
}
...