সুইফটে শক্ত রঙের সাথে ইউআইআইএমেজ তৈরি করুন


140

আমি প্রোগ্রামিয়ালি একটি শক্ত রঙ দ্বারা ভরাট একটি ইউআইআইমেজ তৈরি করতে চাই। সুইফটে কীভাবে এটি করবেন তা সম্পর্কে কারও ধারণা আছে?


UIImageকোনও -initWithSize:andColor:পদ্ধতি NSImageনেই তবে ওএস এক্সে রয়েছে you আপনি কি এর জন্য কোনও কাস্টম লাইব্রেরি বা বিভাগ ব্যবহার করছেন?
ttarik

দুঃখিত, এটি সত্য যে আমি এটি একটি বিভাগের মাধ্যমে ব্যবহার করেছি (একটি পুরানো প্রকল্পের দিকে তাকিয়ে)। শুধু আমার প্রশ্ন সম্পাদনা করুন।
হেনরি ফ্যাম 11

উত্তর:


194

আর একটি দুর্দান্ত সমাধান, সুইফট ২.২ সামঞ্জস্যপূর্ণ, এইভাবে ইউআইআইমেজে আরেকটি কনস্ট্রাক্টর তৈরি করা:

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

অথবা, allyচ্ছিকভাবে, কাস্টম আকার সহ চিত্রটি তৈরি করুন:

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) রেফ: ডেভেলপার.এপ্লে
লাইব্রেরি

3
আমরা কীভাবে এই চিত্রগুলি রাউন্ডার কর্নার তৈরি করতে পারি?
উমায়ের আফজাল

কেন আমরা শুধু ফিরতে পারি না image? কেন এটি করা দরকার? self.init(cgImage: cgImage)
আন্দ্রে গাগান

অ্যান্ড্রেগাগান আফাইক, আপনি UIImageকোনও নির্মাণকারীর মধ্যে নতুন তৈরির সাথে নিজেকে "প্রতিস্থাপন" করতে পারবেন না , তবে UIImage.init(cgImage: )পরিবর্তে আপনি কনস্ট্রাক্টরের মাধ্যমে চেইন করতে পারেন ।
Alnitak

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
}

এটি আপনার সুইফট কোডে আটকে দিন এবং কল করুন

সুইফট ৩.১:

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)
হেনরি ফ্যাম 10

1
সাধারণত, পরিবর্তনীয় পরিবর্তনের letপরিবর্তে ব্যবহার করার চেষ্টা করুন var; এখানে উভয়ই ঘোষণা হিসাবে ব্যবহার করা উচিত rectনয় বলে মনে হচ্ছে । imagevar
জোড়ায়র

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
আমি পছন্দ করি যে চিত্রটি তৈরি হয়েছে তা কোনও
alচ্ছিক

1
আমি এটি খুব পছন্দ করি, আমার কাছে এটি চিত্রটির চেয়ে রঙ থেকে রঙ বাড়ানোটি অনেক অর্থবোধ করে।
নিরব

1
(⚠️ আইওএস 10 বা আরও নতুন)। সুন্দর এবং পরিষ্কার উত্তর বিটিডব্লিউ।
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())কালো পটভূমি সহ একটি চিত্র তৈরি করতে।


আমরা কীভাবে এই চিত্রগুলি রাউন্ডার কর্নার তৈরি করতে পারি?
উমায়ের আফজাল

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
ttarik

আপনার দ্বিতীয় পদ্ধতিটি এখনও একটি চিত্র নয়, একটি চিত্র তৈরি করে, যা @ বিলোপকে নির্দেশ করছে।
rdelmar

সংযুক্ত 3 সংযুক্ত। এখন আমাদের বেশ কয়েকটি উপায় রয়েছে। একটি ইউআইআইমেজভিউ দিয়ে চূড়ান্ত এক।
স্টিভ রোজেনবার্গ

1
getImageWithColor(color: UIColor, size: CGSize) -> UIImageউত্তরটি হিসাবে পদ্ধতিটি যথেষ্ট, কারণ আমি মনে করি প্রত্যেকে এটিকে একটি ইউআইআইজেভিউ ভিউয়ের সাথে একসাথে ব্যবহার করবে না
হেনরি ফ্যাম

আমরা কীভাবে এই চিত্রগুলি রাউন্ডার কর্নার তৈরি করতে পারি?
উমায়ের আফজাল

9

@ নিউনির দুর্দান্ত উত্তরে একটি সামান্য টুইট, যাতে কলিং কোডটি সিজি সাইজ তৈরি করার প্রয়োজন হয় না, এবং নামটি পরিবর্তন করে অন্য অনেকের সাথে সংঘর্ষ না ঘটে:

সুইফট 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

আপনি নতুন আইওএস 10 ইউআইজিগ্রাফিকস আইমেজরেন্ডারার ব্যবহার করতে পারেন API ।

সুইফট ৩.১- এ ইউআইকিওলারের একটি বর্ধন এখানে রয়েছে

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 সংস্করণে সুইফট করুন:

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.