xyk blog

最近は iOS 開発の記事が多めです。

単色で塗りつぶした UIImage を生成する

指定した UIColor の単色で塗りつぶした UIImage を生成したい。

※ 追記済み

Swift5

iOS10.0 から追加された UIGraphicsImageRenderer を使用する。

A. UIColor の Extension に追加

extension UIColor {
    func image(size: CGSize) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { rendererContext in
            self.setFill() // 色を指定
            rendererContext.fill(.init(origin: .zero, size: size)) // 塗りつぶす
        }
    }
}

使用時

let redImage = UIColor.red.image(size: .init(width: 50, height: 50))

B. UIImage の Extension に追加

extension UIImage {
    convenience init?(color: UIColor, size: CGSize) {
        guard let cgImage = UIGraphicsImageRenderer(size: size).image(actions: { rendererContext in
            rendererContext.cgContext.setFillColor(color.cgColor) // 色を指定
            rendererContext.fill(.init(origin: .zero, size: size)) // 塗りつぶす
        }).cgImage else {
            return nil
        }
        self.init(cgImage: cgImage)
    }
}

使用時

// Optional
let blueImage = UIImage(color: .blue, size: .init(width: 50, height: 50))

Swift3

UIImage の Extension に追加。

extension UIImage {
    
    static func image(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let context = UIGraphicsGetCurrentContext()!
        context.setFillColor(color.cgColor)
        context.fill(CGRect(origin: .zero, size: size))
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

使用時

let greenImage = UIImage.image(color: .green, size: CGSize(width: 50, height: 50))

Swift2

UIImage の Extension に追加。

import UIKit

extension UIImage {
    
    static func image(color color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContext(size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, CGRect(origin: CGPointZero, size: size))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

使用時

let greenImage = UIImage.image(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50))