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


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.