আমি কীভাবে সুইফটে একটি ইউআইআইমেজ রঙ করতে পারি?


103

আমি একটি চিত্র নামের arrowWhite। আমি এই চিত্রটি কালো করতে চাই।

func attachDropDownArrow() -> NSMutableAttributedString {
    let image:UIImage = UIImage(named: "arrowWhite.png")!
    let attachment = NSTextAttachment()
    attachment.image = image
    attachment.bounds = CGRectMake(2.25, 2, attachment.image!.size.width - 2.25, attachment.image!.size.height - 2.25)
    let attachmentString = NSAttributedString(attachment: attachment)
    let myString = NSMutableAttributedString(string: NSString(format: "%@", self.privacyOptions[selectedPickerRow]) as String)
    myString.appendAttributedString(attachmentString)
    return myString
}

আমি এই চিত্রটি পেতে চাই blackColour
tintColorকাজ করছে না...


ইন্টারফেস বিল্ডারের কাছ থেকে করণীয়, @ হ্যারি ব্লুমের নীচে থেকে নীচে দেখুন
অ্যান্ডি ওয়েইনস্টেইন

সর্বাধিক মার্জিত সমাধান: স্ট্যাকওভারফ্লো.com
63167556

উত্তর:


196

সুইফট 4 এবং 5

extension UIImageView {
  func setImageColor(color: UIColor) {
    let templateImage = self.image?.withRenderingMode(.alwaysTemplate)
    self.image = templateImage
    self.tintColor = color
  }
}

এভাবে কল করুন:

let imageView = UIImageView(image: UIImage(named: "your_image_name"))
imageView.setImageColor(color: UIColor.purple)

সুইফট 3, 4 বা 5 এর জন্য অল্টারনেটিভ

extension UIImage {

    func maskWithColor(color: UIColor) -> UIImage? {
        let maskImage = cgImage!

        let width = size.width
        let height = size.height
        let bounds = CGRect(x: 0, y: 0, width: width, height: height)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
        let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!

        context.clip(to: bounds, mask: maskImage)
        context.setFillColor(color.cgColor)
        context.fill(bounds)

        if let cgImage = context.makeImage() {
            let coloredImage = UIImage(cgImage: cgImage)
            return coloredImage
        } else {
            return nil
        }
    }

}

সুইফট ২.৩ এর জন্য

extension UIImage {
func maskWithColor(color: UIColor) -> UIImage? {

    let maskImage = self.CGImage
    let width = self.size.width
    let height = self.size.height
    let bounds = CGRectMake(0, 0, width, height)

    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)
    let bitmapContext = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue) //needs rawValue of bitmapInfo

    CGContextClipToMask(bitmapContext, bounds, maskImage)
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor)
    CGContextFillRect(bitmapContext, bounds)

    //is it nil?
    if let cImage = CGBitmapContextCreateImage(bitmapContext) {
        let coloredImage = UIImage(CGImage: cImage)

        return coloredImage

    } else {
        return nil
    } 
 }
}

এভাবে কল করুন:

let image = UIImage(named: "your_image_name")
testImage.image =  image?.maskWithColor(color: UIColor.blue)

8
দুর্দান্ত শুরু, তবে ফলাফল দানাদার। @ ডার্কো নীচের হিসাবে উল্লেখ করেছেন, আমি বিশ্বাস করি এটি কারণ আপনি স্কেল এবং অন্যান্য পরামিতিগুলি বিবেচনায় নিচ্ছেন না।
TruMan1

4
আমার জন্য একই
পিক্সেলিটেড

সুইফট 3 এ আমার জন্য প্রিফেক্ট কাজ করেছে
অস্কার ক্যাটাটলন

4
স্কেলিং এবং ওরিয়েন্টেশন সংরক্ষণ করে না।
শৈলেশ

ভিতরে এক্সটেনশন, ফাংশনটি সর্বজনীন হতে হবে
শিবাম পোখরিয়াল

89

টেমপ্লেট মোডেUIImage স্বয়ংক্রিয়ভাবে রেন্ডার করা একটি পাওয়ার জন্য একটি বিল্ট ইন পদ্ধতি রয়েছে । এটি চিত্রের রঙিন করতে একটি দর্শনটির টিন্ট কালার ব্যবহার করে:

let templateImage = originalImage.imageWithRenderingMode(UIImageRenderingModeAlwaysTemplate)
myImageView.image = templateImage
myImageView.tintColor = UIColor.orangeColor()

4
আরও তথ্যের অ্যাপল ডক্সে পাওয়া যেতে পারে - - এটি সর্বোত্তম উত্তর developer.apple.com/library/content/documentation/...
মার্ক

6
: সুইফট 3 সিনট্যাক্স এখানে মোড রেন্ডারিং দেখুন stackoverflow.com/a/24145287/448718
Phil_Ken_Sebben

6
imageview ব্যবহার সুস্পষ্ট, কিন্তু আমরা UIImage চান শুধুমাত্র
djdance

4
আপনি যদি ইউআইআইমেজভিউর থেকে স্বতন্ত্রভাবে ইউআইআইজেজ অবজেক্টের সাথে কাজ করছেন তবে কোনও সমাধান নয়। এটি কেবলমাত্র তখনই কাজ করে যদি আপনি
পেজ

এমনকি যখন আইজামভিউ একটি ইউআইবাটন হয় তখনও দুর্দান্ত কাজ করে
daxh

43

প্রথমে আপনাকে .xcassets ফোল্ডারে চিত্রের রেন্ডারিং সম্পত্তি "টেমপ্লেট চিত্র" এ পরিবর্তন করতে হবে। তারপরে আপনি কেবল আপনার ইউআইআইভিউভিউয়ের দৃষ্টান্তের রঙের বৈশিষ্ট্যটি পরিবর্তন করতে পারেন:

imageView.tintColor = UIColor.whiteColor()

এখানে চিত্র বর্ণনা লিখুন


4
কি tintColorজায়গাগুলি থেকে সরানো হয়েছে UIImageকিছু সময়ে? আমি এই উত্তরটি সম্পর্কে উত্সাহিত হয়েছি, তবে এটি আইওএস 10
ট্র্যাভিস গ্রিগস 0

4
আরে @ ট্র্যাভিসগ্রিগস দুঃখিত, আমি আমার উত্তরটি কিছুটা বর্ণনামূলক বলে সম্পাদনা করেছি, টিন্ট কালারের সম্পত্তি ইউআইআইমেজভিউতে রয়েছে, ইউআইআইমেজ নয়
হ্যারি ব্লুম

টিএক্স, এটি এত দুর্দান্ত! দ্রষ্টব্য: আরও কিছুটা নিচে ইমেজভিউ পরিদর্শকের ভিউ বিভাগে এই চিত্রটি প্রদর্শিত হবে। শুধু অতিরিক্ত পরিষ্কার হতে।
অ্যান্ডি ওয়াইনস্টাইন

31

আমি এর সাথে শেষ করেছি কারণ অন্যান্য উত্তরগুলি হয় রেজোলিউশন হারাতে পারে বা ইউআইআইমেজভিউয়ের সাথে কাজ করে, ইউআইআইমেজ নয়, বা অপ্রয়োজনীয় ক্রিয়া সহ:

সুইফট 3

extension UIImage {

    public func maskWithColor(color: UIColor) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let context = UIGraphicsGetCurrentContext()!

        let rect = CGRect(origin: CGPoint.zero, size: size)

        color.setFill()
        self.draw(in: rect)

        context.setBlendMode(.sourceIn)
        context.fill(rect)

        let resultImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return resultImage
    }

}

4
এখানে সেরা উত্তর, একই চিত্রের ওরিয়েন্টেশন এবং মানের রাখে
স্মার্টট্রি

হ্যাঁ, আমি উপরের সমস্ত উত্তর পরীক্ষা করেছি এবং এটি প্রকৃতপক্ষে স্কেলটিকে বিবেচনায় নিয়েছে, সুতরাং এটি আপনাকে পিক্সেলটেড দেয় না UIImage। সত্যিই দুর্দান্ত উত্তর, ধন্যবাদ!
গিলহর্ম মাতুেলা

21

এটি অর্জন করতে এই ফাংশনটি মূল গ্রাফিক্স ব্যবহার করে।

func overlayImage(color: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale)
    let context = UIGraphicsGetCurrentContext()

    color.setFill()

    context!.translateBy(x: 0, y: self.size.height)
    context!.scaleBy(x: 1.0, y: -1.0)

    context!.setBlendMode(CGBlendMode.colorBurn)
    let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
    context!.draw(self.cgImage!, in: rect)

    context!.setBlendMode(CGBlendMode.sourceIn)
    context!.addRect(rect)
    context!.drawPath(using: CGPathDrawingMode.fill)

    let coloredImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return coloredImage
}

8
এটি কাজ করে, যেখানে অন্য শীর্ষ দুটি উত্তর ভুল।
chrysb

4
হ্যাঁ এটি পুরোপুরি কাজ করে। maskWithColor এক্সটেনশন কাজ করে তবে যা উপেক্ষা করে scaleতাই চিত্র উচ্চতর রেজোলিউশন ডিভাইসে তীক্ষ্ণ লাগে না।
উদ্দিন

এটি নিখুঁত কাজ করে !! আমরা একটি এক্সটেনশনে ব্যবহার করি এবং ঠিক আছে runs অন্যদের সমাধান স্কেল উপেক্ষা করুন ...
জাভি ক্যাম্পাসা

17

সুইফ ৪.২ এর জন্য ইউআইআইমেজ রঙটি যেমন আপনি চান তেমন পরিবর্তন করতে (শক্ত রঙ)

extension UIImage {
    func imageWithColor(color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color.setFill()

        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: 0, y: self.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.setBlendMode(CGBlendMode.normal)

        let rect = CGRect(origin: .zero, size: CGSize(width: self.size.width, height: self.size.height))
        context?.clip(to: rect, mask: self.cgImage!)
        context?.fill(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }
}

ব্যবহারবিধি

self.imgVw.image = UIImage(named: "testImage")?.imageWithColor(UIColor.red)

10

ইউআইআইমেজে একটি এক্সটেনশন তৈরি করুন:

/// UIImage Extensions
extension UIImage {
    func maskWithColor(color: UIColor) -> UIImage {

        var maskImage = self.CGImage
        let width = self.size.width
        let height = self.size.height
        let bounds = CGRectMake(0, 0, width, height)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
        let bitmapContext = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo)

        CGContextClipToMask(bitmapContext, bounds, maskImage)
        CGContextSetFillColorWithColor(bitmapContext, color.CGColor)
        CGContextFillRect(bitmapContext, bounds)

        let cImage = CGBitmapContextCreateImage(bitmapContext)
        let coloredImage = UIImage(CGImage: cImage)

        return coloredImage!
    }
}

তারপরে আপনি এটির মতো ব্যবহার করতে পারেন:

image.maskWithColor(UIColor.redColor())

4
এই উপেক্ষা scale, orientationএবং অন্যান্য আবশ্যক পরামিতি উল্লেখ UIImage
নিকোলাই রুহে

10

আমি এইচআর দ্বারা সমাধানটি সর্বাধিক সহায়ক বলে মনে করেছি তবে এটি সুইফট 3 এর জন্য সামান্য মানিয়ে নিয়েছি

extension UIImage {

    func maskWithColor( color:UIColor) -> UIImage {

         UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale)
         let context = UIGraphicsGetCurrentContext()!

         color.setFill()

         context.translateBy(x: 0, y: self.size.height)
         context.scaleBy(x: 1.0, y: -1.0)

         let rect = CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height)
         context.draw(self.cgImage!, in: rect)

         context.setBlendMode(CGBlendMode.sourceIn)
         context.addRect(rect)
         context.drawPath(using: CGPathDrawingMode.fill)

         let coloredImage = UIGraphicsGetImageFromCurrentImageContext()
         UIGraphicsEndImageContext()

         return coloredImage!
    }
}

এটি বিবেচনার স্কেল গ্রহণ করে এবং অন্যান্য সমাধানের মতো নিম্ন চিত্রের উত্পাদনও করে না। ব্যবহার:

image = image.maskWithColor(color: .green )

এটি অবশ্যই ব্যবহারের বাস্তবায়ন (এই পৃষ্ঠায় অন্যদের থেকে বিস্মৃত হওয়া)।
স্কট কর্সক্যাডেন

অতিরিক্ত সুরক্ষিত হওয়ার জন্য ফোর্স আনপ্রেপগুলি যদি-চলুন বা কোনও প্রহরীকে আবৃত করা উচিত।
ক্রিস প্যাভগ্লিও

6

@ নিকোলাই রুহে উত্তর থেকে সুইফট 3 এক্সটেনশন র‌্যাপার।

extension UIImageView {

    func maskWith(color: UIColor) {
        guard let tempImage = image?.withRenderingMode(.alwaysTemplate) else { return }
        image = tempImage
        tintColor = color
    }

}

এটি UIButtonপাশাপাশি ব্যবহার করা যেতে পারে , যেমন:

button.imageView?.maskWith(color: .blue)

5

সুইফট 4

 let image: UIImage? =  #imageLiteral(resourceName: "logo-1").withRenderingMode(.alwaysTemplate)
    topLogo.image = image
    topLogo.tintColor = UIColor.white

4

আপনার কোডটিতে এই এক্সটেনশনটি যুক্ত করুন এবং স্টোরিবোর্ডে চিত্রের রঙ পরিবর্তন করুন।

সুইফ্ট 4 এবং 5:

extension UIImageView {
    @IBInspectable
    var changeColor: UIColor? {
        get {
            let color = UIColor(cgColor: layer.borderColor!);
            return color
        }
        set {
            let templateImage = self.image?.withRenderingMode(.alwaysTemplate)
            self.image = templateImage
            self.tintColor = newValue
        }
    }
}

স্টোরিবোর্ড পূর্বরূপ:

এখানে চিত্র বর্ণনা লিখুন



1

সুইফট 3

21 জুন 2017

আমি আলফা চ্যানেলের সাথে প্রদত্ত চিত্রটি মাস্ক করতে ক্যালায়ার ব্যবহার করি

import Foundation


extension UIImage {

    func maskWithColor(color: UIColor) -> UIImage? {
    
        let maskLayer = CALayer()
        maskLayer.bounds = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        maskLayer.backgroundColor = color.cgColor
        maskLayer.doMask(by: self)
        let maskImage = maskLayer.toImage()
        return maskImage
    }

}


extension CALayer {
    func doMask(by imageMask: UIImage) {
        let maskLayer = CAShapeLayer()
        maskLayer.bounds = CGRect(x: 0, y: 0, width: imageMask.size.width, height: imageMask.size.height)
        bounds = maskLayer.bounds
        maskLayer.contents = imageMask.cgImage
        maskLayer.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
        mask = maskLayer
    }

    func toImage() -> UIImage?
    {
        UIGraphicsBeginImageContextWithOptions(bounds.size,
                                               isOpaque,
                                               UIScreen.main.scale)
        guard let context = UIGraphicsGetCurrentContext() else {
            UIGraphicsEndImageContext()
            return nil
        }
        render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

1

@ কুজডু উত্তর থেকে স্কেল এবং ওরিয়েন্টেশন সহ সুইফ্ট 3 সংস্করণ

extension UIImage {

    func mask(_ color: UIColor) -> UIImage? {
        let maskImage = cgImage!

        let width = (cgImage?.width)!
        let height = (cgImage?.height)!
        let bounds = CGRect(x: 0, y: 0, width: width, height: height)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
        let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!

        context.clip(to: bounds, mask: maskImage)
        context.setFillColor(color.cgColor)
        context.fill(bounds)

        if let cgImage = context.makeImage() {
            let coloredImage = UIImage.init(cgImage: cgImage, scale: scale, orientation: imageOrientation)
            return coloredImage
        } else {
            return nil
        }
    }
}

1

সুইফট 4।

একটি শক্ত রঙিন চিত্র তৈরি করতে এই এক্সটেনশনটি ব্যবহার করুন

extension UIImage {   

    public func coloredImage(color: UIColor) -> UIImage? {
        return coloredImage(color: color, size: CGSize(width: 1, height: 1))
    }

    public func coloredImage(color: UIColor, size: CGSize) -> UIImage? {

        UIGraphicsBeginImageContextWithOptions(size, false, 0)

        color.setFill()
        UIRectFill(CGRect(origin: CGPoint(), size: size))

        guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
        UIGraphicsEndImageContext()

        return image
    }
}

নেভিগেশনবার.সেটব্যাকগ্রাউন্ড ইমেজ এবং সুইফটে আমার জন্য প্রিফেক্ট কাজ করেছেন Thanks ধন্যবাদ!
জেসি

1

আইওএস 13 পোস্ট করুন আপনি এটি এর মতো কিছু ব্যবহার করতে পারেন

arrowWhiteImage.withTintColor(.black, renderingMode: .alwaysTemplate)

1

এক্সটেনশন ফাংশন যুক্ত করুন:

extension UIImageView {
    func setImage(named: String, color: UIColor) {
        self.image = #imageLiteral(resourceName: named).withRenderingMode(.alwaysTemplate)
        self.tintColor = color
    }
}

এর মতো ব্যবহার করুন:

anyImageView.setImage(named: "image_name", color: .red)

0

এইচআর এর সমাধানের দ্রুত সংস্করণটি এখানে দেওয়া হল।

func overlayImage(color: UIColor) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale)
    let context = UIGraphicsGetCurrentContext()

    color.setFill()

    context!.translateBy(x: 0, y: self.size.height)
    context!.scaleBy(x: 1.0, y: -1.0)

    context!.setBlendMode(CGBlendMode.colorBurn)
    let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
    context!.draw(self.cgImage!, in: rect)

    context!.setBlendMode(CGBlendMode.sourceIn)
    context!.addRect(rect)
    context!.drawPath(using: CGPathDrawingMode.fill)

    let coloredImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return coloredImage
}

-1

যেহেতু আমি ডার্কোর উত্তরটি মানচিত্র ভিউ টীকাগুলির জন্য কাস্টম পিনগুলি রঙিন করতে খুব সহায়ক বলে খুঁজে পেয়েছি, তবে সুইফট 3-র জন্য কিছু রূপান্তর করতে হয়েছিল, তাই ভেবেছিলাম যে আমি তার উত্তরটির জন্য আমার প্রস্তাবের সাথে আপডেট করব:

extension UIImage {
    func maskWithColor(color: UIColor) -> UIImage {

        var maskImage = self.CGImage
        let width = self.size.width
        let height = self.size.height
        let bounds = CGRect(x: 0, y: 0, width: width, height: height)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
        let bitmapContext = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)

        bitmapContext!.clip(to: bounds, mask: maskImage!)
        bitmapContext!.setFillColor(color.cgColor)
        bitmapContext!.fill(bounds)

        let cImage = bitmapContext!.makeImage()
        let coloredImage = UIImage(CGImage: cImage)

        return coloredImage!
    }
}

-2

আমি এখানে পাওয়া এক্সটেনশানটি পরিবর্তন করেছি: গিথুব গিস্ট , Swift 3যার জন্য আমি ইউআইআইমেজ এর জন্য একটি এক্সটেনশনের প্রসঙ্গে পরীক্ষা করেছি।

func tint(with color: UIColor) -> UIImage 
{
   UIGraphicsBeginImageContext(self.size)
   guard let context = UIGraphicsGetCurrentContext() else { return self }

   // flip the image
   context.scaleBy(x: 1.0, y: -1.0)
   context.translateBy(x: 0.0, y: -self.size.height)

   // multiply blend mode
   context.setBlendMode(.multiply)

   let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
   context.clip(to: rect, mask: self.cgImage!)
   color.setFill()
   context.fill(rect)

   // create UIImage
   guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { return self }
   UIGraphicsEndImageContext()

   return newImage
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.