【问题标题】:Generate texture UIImage from small image in Swift在 Swift 中从小图像生成纹理 UIImage
【发布时间】:2017-07-04 04:32:39
【问题描述】:

我想从现有的UIImage 大小为 40 x 40 的纹理图像创建一个全尺寸的纹理图像,比如说 1000 x 1000。

我用来创建图像的代码是

let textureImg = UIImage(CGImage: CGImageCreateWithImageInRect(textureImage?.CGImage, CGRect(origin: CGPointZero, size: CGSizeMake(1000, 1000)))!)

textureImage 是 40x40 的图像。

请让我知道任何正确的方法来实现这一点,因为上面的代码没有给出正确的结果。整个图像变成白色。

【问题讨论】:

  • 纹理是指“平铺”吗?如果是这样,请查看 CIAffineTile (developer.apple.com/library/content/documentation/…)。如果您需要一些代码,请告诉我。
  • let textureImg = UIImage(color: UIColor(patternImage: textureImage!), size: CGSizeMake(300, 300))! 可以很好地生成与CIAffineTile 相同的平铺图像。但是,我无法正确实现 CIAffineTile,示例会很有帮助。

标签: objective-c swift uiimageview uiimage textures


【解决方案1】:

以下是如何使用 CIAffineTile 将 40x40 的图像平铺成 500x500 的图像。请注意,我正在做一些不需要的强制解包等,因为我从现有代码中提取了它。这是经过测试的。

let inputImage = UIImage(named: "vermont.jpg")
let tiledImage = createTiledImage(inputImage:inputImage!)
print(inputImage!.size)  // displays (40.0, 40.0)
print(tiledImage.size)   // displays (500.0,500.0)
imageView.image = tiledImage

func createTiledImage(inputImage:UIImage) -> UIImage {
    let filter = CIFilter(name: "CIAffineTile")
    filter!.setValue(CIImage(image: inputImage), forKey: "inputImage")
    let outputImage = filter?.outputImage?.applyingFilter("CIAffineTile", withInputParameters: nil).cropping(to: CGRect(x: 0, y: 0, width: 500, height: 500))
    let ciCtx = CIContext(options: nil)
    let cgimg = ciCtx.createCGImage(outputImage!, from: (outputImage?.extent)!)
    return UIImage(cgImage: cgimg!)
}

【讨论】:

  • 您有什么理由使用 CIAffineTile 两次,而不是简单地将“过滤器”作为原始图像?
  • 应该不会吧?如前所述,我从现有代码中提取并进行了测试。从我所看到的你应该能够(a)将inputImage添加到let outputImage =语句中或(b)将outputImage调用更改为简单地filter?outputImage - 记住有大量的强制展开等等,你可以摆脱。 (是的,这是一个草率的代码——就像在not生产准备中一样——但它确实回答了这个问题。)
猜你喜欢
  • 2019-11-23
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多