Swift'te düz renkle UIImage oluşturun


140

Programlı olarak düz renkle doldurulmuş bir UIImage oluşturmak istiyorum. Swift'te bunun nasıl yapılacağı hakkında bir fikri olan var mı?


UIImagebir -initWithSize:andColor:yöntemi yok, ancak NSImageOS X'te var. Bunun için özel bir kitaplık veya kategori mi kullanıyorsunuz?
ttarik

Üzgünüz, bir kategoride kullandığım doğru (eski bir projeye bakarak). Sadece sorumu düzenle.
Henry Pham

Yanıtlar:


194

Swift 2.2 uyumlu başka bir güzel çözüm, UIImage'da bu şekilde başka bir kurucu yaratmaktır:

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

Bu şekilde özel renkli görüntüyü bu şekilde oluşturabilirsiniz:

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

Veya isteğe bağlı olarak, resmi özel boyutta oluşturun:

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

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

1
1x boyutunda resim oluşturmak istiyorsanız, şu kodla başlayın UIGraphicsBeginImageContextWithOptions(rect.size, true, 1.0) ref: developer.apple.com/library/ios/documentation/UIKit/Reference/…
nahung89

3
Bu görüntüleri nasıl köşeye yuvarlayabiliriz?
Umair Afzal

Neden geri dönemeyiz image? Bunu neden yapmanız gerekiyor? self.init(cgImage: cgImage)
Andrey Gagan

@AndreyGagan AFAIK, UIImagebir yapıcıda yeni oluşturulan ile kendini "değiştiremezsiniz" , ancak UIImage.init(cgImage: )bunun yerine kurucu aracılığıyla zincirleme yapabilirsiniz .
Alnitak

2
Görüntü uygun ölçekle oluşturulmamış. Örneğin boyut 1x1 olduğunda, ana ekran ölçeği 2.0 olduğunda görüntü 2x2 döndürülür. Sen çağırmalıdırself.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
Marián Cerny

92

İşte başka bir seçenek. Tam bir UIImage nesnesi istediğine inanıyorum.

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
}

Bunu Swift kodunuza yapıştırın ve arayın

Hızlı 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
}

Ben hiçbir yöntem olduğunu düşünüyorum UIRectMake(0, 0, size.width, size.height), bu doğru biri olarak görünüyor: CGRectMake(0, 0, size.width, size.height).
Henry Pham

1
Genellikle değişmez değişkenler letyerine kullanmaya çalışın var; Burada ne gibi görünüyor rectne de imagekullanıyor olmalıdır varbeyanı.
Zorayr

1
Bu görüntüleri nasıl köşeye yuvarlayabiliriz?
Umair Afzal

83

Swift 4 sürümü:

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

Kullanımı:

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

3
Oluşturulan görüntünün isteğe bağlı olmadığını
seviyorum

1
Bunu çok seviyorum, benim için uzantının görüntüden ziyade renkten olması çok mantıklı.
quemeful

1
(İOS️ iOS 10 veya daha yenisi). Güzel ve temiz cevap btw.
frouo

19

Daha temiz bir yaklaşım, mantığı bir UIImageuzantı içinde kapsüllemek olacaktır :

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

Artık tüketici, UIImage.imageWithColor(UIColor.blackColor())siyah arka plana sahip bir görüntü oluşturmak için arayabilir .


Bu görüntüleri nasıl köşeye yuvarlayabiliriz?
Umair Afzal

10
class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView.backgroundColor = UIColor.redColor()
    }
}

IBOutlet üzerinden bir görüntüyü bağlamak yerine görüntüyü kendiniz çizmek istiyorsanız benzer yöntem.

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

Üçüncü yöntem anthonyliao borçlanma. Biraz daha karmaşık:

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
Bu muhtemelen OP'nin istediği efekti elde eder, ancak a UIImageayarlamak için değil, a oluşturma yöntemine sahip oldukları hiçbir şeye değmez UIImageView.
ttarik

İkinci yönteminiz, @ ev0lution'ın işaret ettiği görüntü değil, bir görüntü görünümü oluşturur.
rdelmar

düzenlemek 3 attached. Şimdi bir sürü yolumuz var. UIImageView ile sonuncusu.
Steve Rosenberg

1
getImageWithColor(color: UIColor, size: CGSize) -> UIImageHerkesin bir UIImageView ile birlikte kullanamayacağını düşündüğüm için yöntem cevap olarak yeterli
Henry Pham

Bu görüntüleri nasıl köşeye yuvarlayabiliriz?
Umair Afzal

9

@ Neoneye'in mükemmel cevabına küçük bir değişiklik yaparak, çağrı kodunun CGSize'yi oluşturmak zorunda kalmasına izin vermedi ve çok sayıda başkalarıyla çarpışmamak için adı değiştirdi:

Hızlı 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

Yeni iOS 10 UIGraphicsImageRenderer API'sını kullanabilirsiniz.

İşte Swift 3.1 UIColor bir uzantısı

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

Bunun gibi bir hesaplanmış özelliğe sahip olmanın iyi bir yolu:

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

Kullanımı:

let redImage = UIColor.red.imageRepresentation

Buradaki bazı cevapların biraz yanıltıcı olduğunu düşünüyorum. Çoğu zaman, belirli bir durum değil (1x1 gibi) görüntünün boyutunu belirtmeniz gerekir. Ama bu güzel bir yaklaşım.
Henry Pham

4

@Anthonyliao Swift 3 sürümü Kabul edilen cevap:

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

Köşeleri yuvarlatılmış doğrultu

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.