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.