从图像文件创建CIImage模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从图像文件创建CIImage模式相关的知识,希望对你有一定的参考价值。

我试图了解基于图像文件创建带图案的CIImage的最有效方法是什么。

let patternImage = UIImage(named: "pattern.png")

我采取的第一种方法:

// First create UIColor pattern
let uiColorPattern = UIColor(patternImage: patternImage!) 

// Than init CIColor using the UIColor pattern object
let ciColorPattern = CIColor(color: uiColorPattern)

// Finally, create CIImage using the CIColor initialiser
let ciImagePattern = CIImage(color: ciColorPattern) //

可悲的是,由于未知原因,CIImage只是空白。我也试过应用clampedToExtent()而不是裁剪它但它仍然是空白。

我采取的第二种方法(工作但速度太慢):

UIGraphicsBeginImageContext(size) // create context

patternImage?.drawAsPattern(in: rect) // draw pattern as 'UIImage'

let patternUIImage = UIGraphicsGetImageFromCurrentImageContext() // fetch 'UIImage'

UIGraphicsEndImageContext() // end context

if let patternUIImage = patternUIImage {
     let ciImagePattern = CIImage(image: patternUIImage) // Create 'CIImage' using 'UIImage'
}    

这个方法有效,但正如我所说,太慢了。


总的来说,我的直觉是,如果我能够使第一种方法起作用,它将比第二种方法更有效。

任何其他方法/建议将受到高度赞赏!

答案

您正在采取的第一种方法不适用于WWDC 2013:

所以,因为,你知道,CIColor不处理色彩空间,它不会做CMYK色,也不会做模式。

所以,这些都是你将要失去的东西。

如果您认为自己需要这样,那么可能不是正确的策略。

所以第二种方法就是我们可以优化的方法。我有一个片段,它返回一个模式图像,你可以尝试一下。

        let myImage = UIImage.init(named: "www")
        let imageSize = myImage?.size
        let imageWidth = imageSize?.width
        let imageHeight = imageSize?.height
        let widthIterations = self.view.bounds.size.width / imageWidth!
        let heightIterations = self.view.bounds.size.height / imageHeight!

        UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, UIScreen.main.scale)
        let context = UIGraphicsGetCurrentContext()


            for i in 0 ... Int(heightIterations) {
                let yPoint = CGFloat(i) * imageHeight!
                for j in 0 ... Int(widthIterations) {
                    let xPoint = CGFloat(j) * imageWidth!
                    myImage?.draw(at: CGPoint.init(x: xPoint, y: yPoint))
                }
            }
        let tempImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

enter image description here

Further reading

以上是关于从图像文件创建CIImage模式的主要内容,如果未能解决你的问题,请参考以下文章

将检测到的矩形从纵向 CIImage 转换为横向 CIImage

创建具有相同图像比例的 CIImage?

无法使用CIFilter从CIImage中提取UIImage

MonoTouch 从 CIImage 创建 UIImage 会导致参数无效/选择器错误

如何从Android片段中的相机获取图像

通过自定义 CIFilter 运行图像时 CIImage 属性丢失