我试图了解基于图像文件创建带有模式的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'
}
这种方法有效,但正如我所说,太慢了。
总的来说,我的直觉是,如果我能使第一种方法起作用,它将比第二种方法更有效率。
答案 0 :(得分:3)
你采取的第一种方法不会起作用 来自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()