【问题标题】:Create CIImage Pattern from image file从图像文件创建 CIImage 模式
【发布时间】:2018-05-29 23:50:25
【问题描述】:

我正在尝试了解基于图像文件创建带有图案的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'
}    

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


总的来说,我的直觉是,如果我能让第一种方法奏效,它会比第二种方法高效得多。

任何其他方法/建议将不胜感激!

【问题讨论】:

  • 为什么需要这个?最终结果是什么?图案有多大?
  • 嘿@meaning-matters。谢谢你的回复。我需要 CIImage 来提供 AVMutableVideoComposition->applyingCIFiltersWithHandler。 (developer.apple.com/documentation/avfoundation/…)。图案图像文件非常小。但最终我将应用它的最终矩形是关于 UIScreen 边界的。希望在这里得到一些帮助:)
  • 那么你是在严格的范围内应用这个“模式”,还是在无限的范围内?你真的尝试过任何 CIFIlter 生成器吗?
  • @dfd 是的,严格的界限。 (假设我使用 UIScreen.main.bounds 作为我的矩形)。我没有尝试 CIFilter 生成器,因为我使用的是基于文件的模式。如果有一个接受图像作为输入并生成 CIImage 模式的 CIFilter,那将是完美的,但我还没有找到一个
  • 嘿@meaning-matters,请PM'ing,以防我的评论没有出现

标签: ios uiimage core-image uigraphicscontext ciimage


【解决方案1】:

您采用的第一种方法不起作用 来自 WWDC 2013:

所以,因为,你知道,而且 CIColor 不处理色彩空间,它 不会做 CMYK 颜色,也不会做图案。

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

如果你认为你会需要它,那么可能不会 正确的策略。

所以第二种方法是我们可以优化的。我有一个 sn-p,它返回一个图案图像,你可以试一试。

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

Further reading

【讨论】:

  • 嘿!感谢您的回复。看起来很有希望。你能解释一下你的 sn-p 如何以及(大约)在多大程度上比我所附的更有效吗?
  • 我不确定两者是否更有效地在幕后做同样的事情
  • 我为您提供 CIImage 模式参考的赏金。我认为我们的两个解决方案都是一样的:)
  • @RoiMulia 谢谢 :)
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多