在Swift中用纯色创建UIImage

Hen*_*ham 122 uiimage ios swift

我想以编程方式创建一个由纯色填充的UIImage.任何人都知道如何在Swift中执行此操作?

Luc*_*nzo 177

Swift 2.2兼容的另一个不错的解决方案是在UIImage中创建另一个构造函数,这样:

public extension UIImage {
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        guard let cgImage = image?.CGImage else { return nil }
        self.init(CGImage: cgImage)
    }  
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以通过以下方式创建自定义彩色图像:

let redImage = UIImage(color: .redColor())
Run Code Online (Sandbox Code Playgroud)

或者,可选择使用自定义大小创建图像:

let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200))
Run Code Online (Sandbox Code Playgroud)

Swift 3.0

public extension UIImage {
  public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    let rect = CGRect(origin: .zero, size: size)
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
    color.setFill()
    UIRectFill(rect)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    guard let cgImage = image?.cgImage else { return nil }
    self.init(cgImage: cgImage)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我们怎样才能让这些图像变得更圆? (3认同)
  • 图像没有以适当的比例创建。例如,当尺寸为1x1 时,当主屏幕比例为2.0 时,返回图像2x2。你应该调用`self.init(cgImage: cgImage, scale: image!.scale,orientation: image!.imageOrientation)` (2认同)

小智 91

这是另一种选择.我相信你想要一个精确的UIImage对象.

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
    let rect = CGRectMake(0, 0, size.width, size.height)
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(rect)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}
Run Code Online (Sandbox Code Playgroud)

坚持使用Swift代码并调用它

Swift 3.1:

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
    let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(rect)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return image
}
Run Code Online (Sandbox Code Playgroud)


neo*_*eye 54

Swift 4版本:

extension UIColor {
    func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { rendererContext in
            self.setFill()
            rendererContext.fill(CGRect(origin: .zero, size: size))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let image0 = UIColor.orange.image(CGSize(width: 128, height: 128))
let image1 = UIColor.yellow.image()
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢创建的图像不是可选的 (6认同)

Zor*_*ayr 17

更简洁的方法是将逻辑封装在UIImage扩展中:

import UIKit

extension UIImage {
  class func imageWithColor(color: UIColor) -> UIImage {
    let rect: CGRect = CGRectMake(0, 0, 1, 1)
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), false, 0)
    color.setFill()
    UIRectFill(rect)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
  }
}
Run Code Online (Sandbox Code Playgroud)

现在消费者可以打电话,UIImage.imageWithColor(UIColor.blackColor())创建一个黑色背景的图像.


Ste*_*erg 10

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView.backgroundColor = UIColor.redColor()
    }
}
Run Code Online (Sandbox Code Playgroud)

类似的方法,如果你想自己绘制图像,而不是通过IBOutlet连接图像.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var frame = CGRectMake(100,100,100,100)
        var imageView2 = UIImageView(frame: frame)
        imageView2.backgroundColor = UIColor.redColor()
        self.view.addSubview(imageView2)
    }
}
Run Code Online (Sandbox Code Playgroud)

从anthonyliao借来的第三种方法.有点复杂:

class ViewController: UIViewController {

    func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(CGRectMake(0, 0, 100, 100))
        var image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var imageView = UIImageView(frame: CGRectMake(100,100,100,100))
        let screenImage = getImageWithColor(UIColor.redColor(), size: CGSize(width: 100, height: 100))
        imageView.image = screenImage
        self.view.addSubview(imageView)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这*可能*实现了OP想要的效果,但是他们有一个创建`UIImage`的方法,而不是设置`UIImageView`是没有价值的. (2认同)

小智 7

您可以使用新的iOS 10 UIGraphicsImageRenderer API.

这是Swift 3.1中 UIColor的扩展

extension UIColor {
func getImage(size: CGSize) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: size)
    return renderer.image(actions: { rendererContext in
        self.setFill()
        rendererContext.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
    })
}}
Run Code Online (Sandbox Code Playgroud)


dre*_*w.. 6

对@neoneye的出色答案进行了细微调整,从而允许调用代码无需创建CGSize,并且更改了名称以使其不会与众多其他名称发生冲突:

斯威夫特4

extension UIColor {
    func imageWithColor(width: Int, height: Int) -> UIImage {
        let size = CGSize(width: width, height: height)
        return UIGraphicsImageRenderer(size: size).image { rendererContext in
            self.setFill()
            rendererContext.fill(CGRect(origin: .zero, size: size))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


iOS*_*eek 5

一种不错的方法是具有如下所示的计算属性:

extension UIColor {
    var imageRepresentation : UIImage {
      let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
      UIGraphicsBeginImageContext(rect.size)
      let context = UIGraphicsGetCurrentContext()

      context?.setFillColor(self.cgColor)
      context?.fill(rect)

      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

    return image!
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let redImage = UIColor.red.imageRepresentation
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 5

2023.说实话,就是这么简单!

let image = UIGraphicsImageRenderer(size: sz).image { rendererContext in
    UIColor.gray.setFill()
    rendererContext.fill(CGRect(origin: .zero, size: sz))
}
Run Code Online (Sandbox Code Playgroud)