ilan
ilan

Reputation: 4462

how to change specific color in image to a different color

I have an UIView that its layer contents is an image.

let image = UIImage(names: "myImage")
layer.contents = image.CGImage

This image has a few colors.

Is there a way to change a specific color to any other color of my choice?

I found answers for changing the all of the colors in the image but not a specific one.

answer

Upvotes: 2

Views: 3050

Answers (2)

Morgachev
Morgachev

Reputation: 136

You can't change specific color in PNG with transparent background, but.. i found the solution.

extension UIImage {
    func maskWithColors(color: UIColor) -> UIImage? {
        let maskingColors: [CGFloat] = [100, 255, 100, 255, 100, 255] // We should replace white color.
        let maskImage = cgImage! //
        let bounds = CGRect(x: 0, y: 0, width: size.width * 3, height: size.height * 3) // * 3, for best resolution.
        let sz = CGSize(width: size.width * 3, height: size.height * 3) // Size.
        var returnImage: UIImage? // Image, to return

        /* Firstly we will remove transparent background, because
         maskingColorComponents don't work with transparent images. */

        UIGraphicsBeginImageContextWithOptions(sz, true, 0.0)
        let context = UIGraphicsGetCurrentContext()!
        context.saveGState()
        context.scaleBy(x: 1.0, y: -1.0) // iOS flips images upside down, this fix it.
        context.translateBy(x: 0, y: -sz.height) // and this :)
        context.draw(maskImage, in: bounds)
        context.restoreGState()
        let noAlphaImage = UIGraphicsGetImageFromCurrentImageContext() // new image, without transparent elements.
        UIGraphicsEndImageContext()

        let noAlphaCGRef = noAlphaImage?.cgImage // get CGImage.

        if let imgRefCopy = noAlphaCGRef?.copy(maskingColorComponents: maskingColors) { // Magic.
            UIGraphicsBeginImageContextWithOptions(sz, false, 0.0)
            let context = UIGraphicsGetCurrentContext()!
            context.scaleBy(x: 1.0, y: -1.0)
            context.translateBy(x: 0, y: -sz.height)
            context.clip(to: bounds, mask: maskImage) // Remove background from image with mask.
            context.setFillColor(color.cgColor) // set new color. We remove white color, and set red.
            context.fill(bounds)
            context.draw(imgRefCopy, in: bounds) // draw new image
            let finalImage = UIGraphicsGetImageFromCurrentImageContext()
            returnImage = finalImage! // YEAH!
            UIGraphicsEndImageContext()
        }
        return returnImage
    }
}

For call this function use code like this...

let image = UIImage(named: "Brush").maskWithColor(color: UIColor.red)

Result:

Before, and after using function.

Upvotes: 5

Altay Aliyev
Altay Aliyev

Reputation: 1

You can not change the image color... The only way is to change the image on any event or something... Another variant is to create one image with transparent color, and set the background color of the view or something where you put the image...

Upvotes: -4

Related Questions