स्विफ्ट में ठोस रंग के साथ UIImage बनाएं


140

मैं प्रोग्रामेटिक रूप से एक ठोस रंग से भरा एक UIImage बनाना चाहता हूं। किसी को भी स्विफ्ट में ऐसा करने का एक विचार है?


UIImageएक -initWithSize:andColor:विधि नहीं है , लेकिन NSImageओएस एक्स पर है। क्या आप इसके लिए एक कस्टम लाइब्रेरी या श्रेणी का उपयोग कर रहे हैं?
तारिक

क्षमा करें, यह सच है कि मैंने इसे एक श्रेणी (एक पुरानी परियोजना को देखते हुए) के माध्यम से उपयोग किया। बस मेरे प्रश्न को संपादित करें।
हेनरी फेम

जवाबों:


194

एक और अच्छा समाधान, स्विफ्ट 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
यदि आप 1x आकार के साथ छवि बनाना चाहते हैं, तो इस कोड के साथ शुरू करें UIGraphicsBeginImageContextWithOptions(rect.size, true, 1.0) Ref: developer.apple.com/library/ios/documentation/UIKit/Reference/…
nahung89

3
हम इन छवियों को राउंडर कॉर्नर कैसे बना सकते हैं?
उमैर अफजल

हम सिर्फ क्यों नहीं लौट सकते image? ऐसा करने की आवश्यकता क्यों है? self.init(cgImage: cgImage)
एंड्री गगन

@AndreyGagan AFAIK, आप UIImageएक निर्माणकर्ता में बनाए गए नए के साथ स्वयं को "प्रतिस्थापित" नहीं कर सकते हैं , लेकिन आप UIImage.init(cgImage: )इसके बजाय निर्माता के माध्यम से चेन कर सकते हैं ।
अलनीतक

2
छवि उचित पैमाने के साथ नहीं बनाई गई है। जब आकार 1x1 है, तो मुख्य स्क्रीन स्केल 2.0 होने पर एक छवि 2x2 वापस आ जाती है। आपको कॉल करना चाहिएself.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
मारीना ý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):।
हेनरी फाम

1
आमतौर पर, अपरिवर्तनीय चर के letबजाय उपयोग करने का प्रयास करें var; यहां न की तरह लगता है rectऔर न ही imageउपयोग करना चाहिए varघोषणा।
जोरावर

1
हम इन छवियों को राउंडर कॉर्नर कैसे बना सकते हैं?
उमैर अफजल

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
मुझे यह बहुत पसंद है, मेरे लिए यह छवि के बजाय रंग से विस्तार के लिए बहुत मायने रखता है।
queeful

1
(⚠️ iOS 10 या नया)। अच्छा और साफ जवाब btw।
17

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())काली पृष्ठभूमि के साथ एक छवि बनाने के लिए।


हम इन छवियों को राउंडर कॉर्नर कैसे बना सकते हैं?
उमैर अफजल

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

एंथोनीलियाओ से तीसरी विधि उधार। थोड़ा और जटिल:

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
यह संभवतः उस प्रभाव को प्राप्त करता है जो ओपी चाहता था लेकिन यह कुछ भी नहीं है कि उनके पास ए बनाने की विधि है UIImage, न कि सेट करने की UIImageView
तारिक

आपकी दूसरी विधि अभी भी एक छवि दृश्य बनाती है, न कि एक छवि, जो @ ev0lution इंगित करती है।
rdelmar

3 संलग्न करें। अब हमारे पास तरीकों का एक गुच्छा है। UIImageView के साथ अंतिम एक।
स्टीव रोसेनबर्ग

1
यह विधि getImageWithColor(color: UIColor, size: CGSize) -> UIImageउत्तर के रूप में पर्याप्त है, जैसा कि मुझे लगता है कि हर कोई UIImageView के साथ मिलकर इसका उपयोग नहीं करेगा
हेनरी फाम

हम इन छवियों को राउंडर कॉर्नर कैसे बना सकते हैं?
उमैर अफजल

9

@ नीनी के उत्कृष्ट उत्तर के लिए एक मामूली ट्वीक, जिससे कॉलिंग कोड को 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 का उपयोग कर सकते हैं ।

यहाँ स्विफ्ट 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)। लेकिन यह एक अच्छा तरीका है।
हेनरी फाम

4

स्विफ्ट 3 संस्करण @anthonyliao का स्वीकृत उत्तर:

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

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.