Swift에서 단색으로 UIImage 생성


140

프로그래밍 방식으로 단색으로 채워진 UIImage를 만들고 싶습니다. 누구나 Swift 에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까?


UIImage이없는 -initWithSize:andColor:방법을하지만, NSImage이에 대한 사용자 지정 라이브러리 또는 범주를 사용하고 OS X에서합니까?
ttarik

죄송합니다, 카테고리를 통해 사용했습니다 (오래된 프로젝트를보고). 내 질문을 편집하십시오.
Henry Pham

답변:


194

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

이런 식으로 다음과 같은 방법으로 사용자 지정 컬러 이미지를 만들 수 있습니다.

let redImage = UIImage(color: .redColor())

또는 선택적으로 사용자 정의 크기로 이미지를 작성하십시오.

let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200))

스위프트 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)
  }
}

1
당신이 1 배 크기의 이미지를 만들려면,이 코드로 시작 UIGraphicsBeginImageContextWithOptions(rect.size, true, 1.0) REF : developer.apple.com/library/ios/documentation/UIKit/Reference/...
nahung89

3
이 이미지들을 어떻게 더 둥글게 만들 수 있습니까?
Umair Afzal

왜 우리가 돌아올 수 없는가 image 없습니까? 왜 이렇게해야합니까? self.init(cgImage: cgImage)
Andrey Gagan

@AndreyGagan AFAIK, 새로 생성 UIImage된 생성자로 "대체" 할 수는 없지만 UIImage.init(cgImage: )대신 생성자를 통해 연결할 수 있습니다 .
Alnitak

2
이미지가 적절한 배율로 생성되지 않았습니다. 예를 들어 크기가 1x1이면 기본 화면 배율이 2.0 일 때 이미지 2x2가 반환됩니다. 전화해야합니다self.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
Marián Černý

92

다른 옵션이 있습니다. 나는 당신이 정확한 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
}

이것을 스위프트 코드에 붙이고 호출하십시오.

스위프트 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
}

나는 방법이 없다고 생각 UIRectMake(0, 0, size.width, size.height)합니다. 올바른 방법 인 것 같습니다 CGRectMake(0, 0, size.width, size.height).
Henry Pham

1
일반적으로 불변 변수 let대신에 사용 var하십시오. 여기 선언을 사용 rect하거나 image사용 하지 않아야하는 것처럼 보입니다 var.
Zorayr

1
이 이미지들을 어떻게 더 둥글게 만들 수 있습니까?
Umair Afzal

83

스위프트 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))
        }
    }
}

용법:

let image0 = UIColor.orange.image(CGSize(width: 128, height: 128))
let image1 = UIColor.yellow.image()

3
나는 생성 된 이미지가 선택 사항이 아니라는 것을 좋아한다
jlukanta

1
나는 이것을 매우 좋아합니다. 확장자가 이미지가 아닌 색상에서 오는 것이 의미가 있습니다.
quemeful

1
(⚠️ iOS 10 이상). 멋지고 깨끗한 답변 btw.
frouo

19

보다 확실한 접근 방식은 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
  }
}

이제 소비자는 UIImage.imageWithColor(UIColor.blackColor())검은 배경의 이미지를 만들기 위해 전화를 걸 수 있습니다 .


이 이미지들을 어떻게 더 둥글게 만들 수 있습니까?
Umair Afzal

10
class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView.backgroundColor = UIColor.redColor()
    }
}

이미지를 직접 그리거나 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)
    }
}

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

2
이것은 아마도 OP가 원했던 효과를 얻을 수 있지만 UIImage,를 설정하지 않고을 만드는 방법이 있다는 것은 가치가 없습니다 UIImageView.
ttarik

두 번째 방법은 여전히 ​​이미지가 아닌 이미지 뷰를 생성하는 것입니다. @ ev0lution이 지적한 것입니다.
rdelmar

편집 3 첨부. 이제 많은 방법이 있습니다. UIImageView가있는 마지막 것.
Steve Rosenberg

1
getImageWithColor(color: UIColor, size: CGSize) -> UIImage모든 사람이 UIImageView와 함께 이것을 사용하지는 않을 것이라고 생각하기 때문에이 방법 으로 충분합니다.
Henry Pham

이 이미지들을 어떻게 더 둥글게 만들 수 있습니까?
Umair Afzal

9

@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))
        }
    }
}

8

새로운 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))
    })
}}

6

좋은 방법은 다음과 같이 계산 된 속성을 갖는 것입니다.

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!
  }
}

용법:

let redImage = UIColor.red.imageRepresentation

나는 여기에 몇 가지 대답이 약간 오도라고 생각합니다. 대부분의 경우 특정 사례 (예 : 1x1)가 아니라 이미지 크기를 지정해야합니다. 그러나 이것은 좋은 접근 방법입니다.
Henry Pham

4

@anthonyliao의 스위프트 3 버전 허용되는 답변 :

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

0

모서리가 둥근 사각형

extension UIImage {
convenience init?(color: UIColor) {
    let rect = CGRect(x: 0, y: 0, width: 10, height: 2)
    UIGraphicsBeginImageContextWithOptions(CGSize(width: 10, height: 2), false, 0)
    let bezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 8)
    color.setFill()
    bezierPath.fill()
    let image = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    guard  let cgImage = image.cgImage else {
        return nil
    }
    self.init(cgImage: cgImage)
}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.