Changing UIImage color

前端 未结 13 1364
我寻月下人不归
我寻月下人不归 2020-11-28 19:28

I\'m trying to change color of UIImage. My code:

-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
    UIGraphicsBeginImageContext(         


        
相关标签:
13条回答
  • 2020-11-28 19:54

    Swift 3.0 version of Anna's marvelous code:

    extension UIImage{
    
        static func multiplyImageByConstantColor(image:UIImage,color:UIColor)-> UIImage {
            let backgroundSize = image.size
            UIGraphicsBeginImageContext(backgroundSize)
    
            let ctx = UIGraphicsGetCurrentContext()!
    
            var backgroundRect=CGRect()
            backgroundRect.size = backgroundSize
            backgroundRect.origin.x = 0
            backgroundRect.origin.y = 0
    
            let myFloatForR = 0
            var r = CGFloat(myFloatForR)
            let myFloatForG = 0
            var g = CGFloat(myFloatForG)
            let myFloatForB = 0
            var b = CGFloat(myFloatForB)
            let myFloatForA = 0
            var a = CGFloat(myFloatForA)
    
            color.getRed(&r, green: &g, blue: &b, alpha: &a)
            ctx.setFillColor(red: r, green: g, blue: b, alpha: a)
            ctx.fill(backgroundRect)
    
            var imageRect=CGRect()
            imageRect.size = image.size
            imageRect.origin.x = (backgroundSize.width - image.size.width)/2
            imageRect.origin.y = (backgroundSize.height - image.size.height)/2
    
            // Unflip the image
            ctx.translateBy(x: 0, y: backgroundSize.height)
            ctx.scaleBy(x: 1.0, y: -1.0)
    
            ctx.setBlendMode(.multiply)
            ctx.draw(image.cgImage!, in: imageRect)
    
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage!
        }
    }
    
    0 讨论(0)
  • 2020-11-28 19:55

    This is pretty much the answer above, but slightly shortened. This only takes the image as a mask and does not actually "multiply" or color the image.

    Objective C:

        UIColor *color = <# UIColor #>;
        UIImage *image = <# UIImage #>;// Image to mask with
        UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [color setFill];
        CGContextTranslateCTM(context, 0, image.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextClipToMask(context, CGRectMake(0, 0, image.size.width, image.size.height), [image CGImage]);
        CGContextFillRect(context, CGRectMake(0, 0, image.size.width, image.size.height));
    
        UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext();
    

    Swift:

        let color: UIColor = <# UIColor #>
        let image: UIImage = <# UIImage #> // Image to mask with
        UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
        let context = UIGraphicsGetCurrentContext()
        color.setFill()
        context?.translateBy(x: 0, y: image.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.clip(to: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height), mask: image.cgImage!)
        context?.fill(CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
        let coloredImg = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
    0 讨论(0)
  • 2020-11-28 19:55

    Base on @Anna's answer and I rewrite for swift 2.2 and handles image with alpha channel:

    static func multiplyImageByConstantColor(image:UIImage,color:UIColor)->UIImage{
        let backgroundSize = image.size
        UIGraphicsBeginImageContext(backgroundSize)
    
        let ctx = UIGraphicsGetCurrentContext()
    
        var backgroundRect=CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0
    
        var r:CGFloat = 0
        var g:CGFloat = 0
        var b:CGFloat = 0
        var a:CGFloat = 0
        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        CGContextSetRGBFillColor(ctx, r, g, b, a)
    
        // Unflip the image
        CGContextTranslateCTM(ctx, 0, backgroundSize.height)
        CGContextScaleCTM(ctx, 1.0, -1.0)
        CGContextClipToMask(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
        CGContextFillRect(ctx, backgroundRect)
    
        var imageRect=CGRect()
        imageRect.size = image.size
        imageRect.origin.x = (backgroundSize.width - image.size.width)/2
        imageRect.origin.y = (backgroundSize.height - image.size.height)/2
    
    
        CGContextSetBlendMode(ctx, .Multiply)
        CGContextDrawImage(ctx, imageRect, image.CGImage)
    
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
    
    0 讨论(0)
  • 2020-11-28 19:59

    Swift 4.2 Solution

    extension UIImage {
        func withColor(_ color: UIColor) -> UIImage {
            UIGraphicsBeginImageContextWithOptions(size, false, scale)
            guard let ctx = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return self }
            color.setFill()
            ctx.translateBy(x: 0, y: size.height)
            ctx.scaleBy(x: 1.0, y: -1.0)
            ctx.clip(to: CGRect(x: 0, y: 0, width: size.width, height: size.height), mask: cgImage)
            ctx.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
            guard let colored = UIGraphicsGetImageFromCurrentImageContext() else { return self }
            UIGraphicsEndImageContext()
            return colored
        }
    }
    
    // Usage:
    // let redImage = UIImage().withColor(.red)
    
    0 讨论(0)
  • 2020-11-28 19:59

    If you don't have to do it programmatically, you can just do it using Xcode UI.

    If you go to the image in your image assets folder, open the inspector on the right hand side and there is a "Render As" dropdown with the following options:

    1. Default
    2. Original
    3. Template

    Once you've made the Template selection, you can change the tintColor of the image however you want - whether it is using the Xcode storyboard UI or programmatically.

    See this image:

    0 讨论(0)
  • 2020-11-28 20:00

    Swift 3:

    extension UIImage{
    
        static func multiplyImageByConstantColor(image:UIImage,color:UIColor) -> UIImage{
    
            let backgroundSize = image.size
            UIGraphicsBeginImageContext(backgroundSize)
    
            guard let ctx = UIGraphicsGetCurrentContext() else {return image}
    
            var backgroundRect=CGRect()
            backgroundRect.size = backgroundSize
            backgroundRect.origin.x = 0
            backgroundRect.origin.y = 0
    
            var r:CGFloat = 0
            var g:CGFloat = 0
            var b:CGFloat = 0
            var a:CGFloat = 0
            color.getRed(&r, green: &g, blue: &b, alpha: &a)
            ctx.setFillColor(red: r, green: g, blue: b, alpha: a)
    
            // Unflip the image
            ctx.translateBy(x: 0, y: backgroundSize.height)
            ctx.scaleBy(x: 1.0, y: -1.0)
            ctx.clip(to: CGRect(0, 0, image.size.width, image.size.height), mask: image.cgImage!)
            ctx.fill(backgroundRect)
    
    
            var imageRect=CGRect()
            imageRect.size = image.size
            imageRect.origin.x = (backgroundSize.width - image.size.width)/2
            imageRect.origin.y = (backgroundSize.height - image.size.height)/2
    
    
            ctx.setBlendMode(.multiply)
            ctx.draw(image.cgImage!, in: imageRect)
    
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage!
        }
    }
    
    0 讨论(0)
提交回复
热议问题