Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 渲染MTIImage_Ios_Swift_Metal - Fatal编程技术网

Ios 渲染MTIImage

Ios 渲染MTIImage,ios,swift,metal,Ios,Swift,Metal,请不要评判我,我只是在学斯威夫特 最近,我安装了Metalpatal framework,并按照说明进行操作: 但是由于MTIContext,我得到了一个错误。也许我需要申报更多的金属花瓣 我的代码: import UIKit import MetalPetal import CoreGraphics class ViewController: UIViewController { @IBOutlet weak var image1: UIImageView! overri

请不要评判我,我只是在学斯威夫特

最近,我安装了Metalpatal framework,并按照说明进行操作:

但是由于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基于基础石英图像(可使用cgImage检索)或基础岩心图像(可使用ciImage从UIImage检索)

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

MTIContext

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

渲染

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

测试

我已经在上面介绍了您的源代码,并对其稍作修改以适应上述要点

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

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

结果如下所示:

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

在上面的区域中,您可以看到原始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)
        }
    }
}

输入图像

UIImage基于基础石英图像(可使用cgImage检索)或基础岩心图像(可使用ciImage从UIImage检索)

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

MTIContext

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

渲染

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

测试

我已经在上面介绍了您的源代码,并对其稍作修改以适应上述要点

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

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

结果如下所示:

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

在上面的区域中,您可以看到原始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)
        }
    }
}

请你把代码贴出来,不是用图片,而是用文字@对不起。编辑了我的问题。请你把代码贴出来,不是用图片而是用文字@对不起。编辑了我的问题。实际上,它只在iPhone SE、iPhone 6和iPhone 6s上有效。它在我的朋友iPhone 7或更好的iPhone上不起作用。问题在哪里?我可以发布我的代码。我正在使用颜色查找表。对于其他函数,一切都很好。嗯,因为这似乎是一个新的主题(关于颜色查找表),我建议问一个关于stackoverflow的全新问题。Stephan Schlecht已经问过了。事实上,它只在iPhone SE、iPhone 6和iPhone 6s上运行良好。它在我的朋友iPhone 7或更好的iPhone上不起作用。问题在哪里?我可以发布我的代码。我正在使用颜色查找表。对于其他函数,一切都很好。嗯,因为这似乎是一个新的主题(关于颜色查找表),我建议问一个关于stackoverflow的全新问题。Stephan Schlecht已经问过了。