태그 보관물: ios

ios

Swift에서 단색으로 UIImage 생성 단색으로 채워진 UIImage를 만들고 싶습니다. 누구나 Swift

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



답변

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


답변

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


답변

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


답변

보다 확실한 접근 방식은 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())검은 배경의 이미지를 만들기 위해 전화를 걸 수 있습니다 .


답변

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


답변

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


답변

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