How can I color a UIImage in Swift?

后端 未结 20 2119
执念已碎
执念已碎 2020-11-29 18:27

I have an image called arrowWhite. I want to colour this image to black.

func attachDropDownArrow() -> NSMutableAttributedString {
    let im         


        
相关标签:
20条回答
  • 2020-11-29 18:50

    I ended up with this because other answers either lose resolution or work with UIImageView, not UIImage, or contain unnecessary actions:

    Swift 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
        }
    
    }
    
    0 讨论(0)
  • 2020-11-29 18:53

    I found the solution by H R to be most helpful but adapted it slightly for Swift 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!
        }
    }
    

    This takes into consideration scale and also does not produce a lower res image like some other solutions. Usage :

    image = image.maskWithColor(color: .green )
    
    0 讨论(0)
  • 2020-11-29 18:55

    Add this extension in your code and change image color in storyboard itself.

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

    Storyboard Preview:

    0 讨论(0)
  • 2020-11-29 18:55

    Swift 3

    21 June 2017

    I use CALayer to mask the given image with Alpha Channel

    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
        }
    }
    
    0 讨论(0)
  • 2020-11-29 18:55

    Swift 3 version with scale and Orientation from @kuzdu answer

    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
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-29 18:55

    Here is swift 3 version of H R's solution.

    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
    }
    
    0 讨论(0)
提交回复
热议问题