简体   繁体   English

如何将Swift中的白色图像着色为另一种颜色?

[英]How to color a white image in Swift to another color?

I would like to color a white icon to another color in run time, I was trying to use the method taken from here , but without success: 我想在运行时将白色图标变为另一种颜色,我试图使用从这里采取的方法,但没有成功:

    func maskImageView() {
    var maskImageSize = CGSizeMake(self.downloadImageView.frame.width, self.downloadImageView.frame.height)
    UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0)

    var color = UIColor(white: 1.0, alpha: 1.0)
    color.setFill()

    var rect = CGRectMake(0, 0, self.downloadImageView.frame.width, self.downloadImageView.frame.height)
    UIRectFill(rect)

    color = BrandColors.BRAND_FIRST_COLOR
    color.setFill()

    rect = CGRectMake((self.downloadImageView.frame.width/2)-100, (self.downloadImageView.frame.height/2)-100, 200, 200)
    UIRectFill(rect)

    var maskImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    var maskLayer = CALayer()
    maskLayer.frame = CGRectMake(0, 0, self.downloadImageView.bounds.width, self.downloadImageView.bounds.height)
    maskLayer.contents = maskImage.CGImage
    maskLayer.contentsRect = CGRectMake(0, 0, self.downloadImageView.bounds.width, self.downloadImageView.bounds.height)
    self.downloadImageView.layer.mask = maskLayer;
}

I can't actually figure out how this masking thing works. 我实际上无法弄清楚这个掩盖的东西是如何工作的。 What am I doing wrong? 我究竟做错了什么?

I was able to achieve this task with the following method: 我能够使用以下方法完成此任务:

func maskDownloadImageView() {
    downloadImageView.image = downloadImageView.image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
    downloadImageView.tintColor = BrandColors.BRAND_FIRST_COLOR  
}

There is no need in using masking. 没有必要使用掩蔽。

Try this. 尝试这个。

func fillImage(image : UIImage! ,withColor color : UIColor!) -> UIImage!
{
    // Create the proper sized rect
    let imageRect = CGRectMake(0, 0, image.size.width, image.size.height)

    // Create a new bitmap context
    let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
    let context = CGBitmapContextCreate(nil, Int(imageRect.size.width), Int(imageRect.size.height), 8, 0, colorSpace, bitmapInfo)

    // Use the passed in image as a clipping mask
    CGContextClipToMask(context, imageRect, image.CGImage)
    // Set the fill color
    CGContextSetFillColorWithColor(context, color.CGColor)
    // Fill with color
    CGContextFillRect(context, imageRect)

    // Generate a new image
    let newCGImage = CGBitmapContextCreateImage(context)
    let newImage = UIImage(CGImage: newCGImage)


    return newImage;
}

To mask transparent image try this: 要屏蔽透明图像,试试这个:

func maskImageWithColor(color : UIColor!) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
    if let context: CGContextRef = UIGraphicsGetCurrentContext() {
        CGContextTranslateCTM(context, 0, self.size.height)
        CGContextScaleCTM(context, 1.0, -1.0)

        CGContextSetBlendMode(context, .Normal)
        let rect: CGRect = CGRectMake(0, 0, self.size.width, self.size.height)

        // To use gradient, add CGColor to Array

        let colors: [CGColor] = [color.CGColor]
        let colorsPointer = UnsafeMutablePointer<UnsafePointer<Void>>(colors)
        if let colorsCFArray = CFArrayCreate(nil, colorsPointer, colors.count, nil) {
            if let space: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB() {
                if let gradient: CGGradientRef = CGGradientCreateWithColors(space, colorsCFArray, nil) {
                    // Apply gradient
                    CGContextClipToMask(context, rect, self.CGImage)
                    CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(0, self.size.height), .DrawsBeforeStartLocation)
                    let coloredImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()

                    return coloredImage;
                }
            }
        }
    }
    return self
}

You can use gradient just adding more CGColor in the array 您可以使用渐变只在阵列中添加更多CGColor

Swift 4 version of Emil Adz answer for the lazy. Swift 4版的Emil Adz为懒惰的答案。

func maskDownloadImageView() {
    downloadImageView.image = downloadImageView.image?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
    downloadImageView.tintColor = BrandColors.BRAND_FIRST_COLOR
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM