Swift - 如何在不失去清晰背景的情况下改变png色彩?

时间:2018-05-26 14:51:32

标签: ios swift core-graphics

我尝试了以下代码,但它确实有效。它为我的png图像添加了一种色调,但是清晰的背景变为黑色。图像有像阴影一样的细节,所以我不使用普通的renderImageAsTemplate属性。

extension UIImage {
    public func tintImage(with fillColor: UIColor) -> UIImage {
        return modifiedImage { context, rect in
            // draw black background - workaround to preserve color of partially transparent pixels
            context.setBlendMode(.normal)
            UIColor.black.setFill()
            context.fill(rect)

            // draw original image
            context.setBlendMode(.normal)
            context.draw(cgImage!, in: rect)

            // tint image (losing alpha) - the luminosity of the original image is preserved
            context.setBlendMode(.color)
            fillColor.setFill()
            context.fill(rect)

            // mask by alpha values of original image
            context.setBlendMode(.normal)
            context.draw(context.makeImage()!, in: rect)
        }
    }

    fileprivate func modifiedImage(_ draw: (CGContext, CGRect) -> ()) -> UIImage {
        // using scale correctly preserves retina images
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context: CGContext! = UIGraphicsGetCurrentContext()
        assert(context != nil)

        // correctly rotate image
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)

        let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)

        draw(context, rect)

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

有没有办法在保持PNG清晰背景的同时更改图像色调?

0 个答案:

没有答案