Applying Gradient to UIImage Smoothly

前端 未结 2 1850
再見小時候
再見小時候 2021-02-09 12:43

I am trying to apply gradient to UIImage using CoreGraphic; however, the result I got is not very nice. I want to create a black to transparent gradient at the bottom of the ima

相关标签:
2条回答
  • 2021-02-09 13:22

    SWIFT 3

    func imageWithGradient(img:UIImage!) -> UIImage {
    
        UIGraphicsBeginImageContext(img.size)
        let context = UIGraphicsGetCurrentContext()
    
        img.draw(at: CGPoint(x: 0, y: 0))
    
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let locations:[CGFloat] = [0.0, 1.0]
    
        let bottom = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor
        let top = UIColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor
    
        let colors = [top, bottom] as CFArray
    
        let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: locations)
    
        let startPoint = CGPoint(x: img.size.width/2, y: 0)
        let endPoint = CGPoint(x: img.size.width/2, y: img.size.height)
    
        context!.drawLinearGradient(gradient!, start: startPoint, end: endPoint, options: CGGradientDrawingOptions(rawValue: UInt32(0)))
    
        let image = UIGraphicsGetImageFromCurrentImageContext()
    
        UIGraphicsEndImageContext()
    
        return image!
    }
    
    0 讨论(0)
  • 2021-02-09 13:25

    I tried this out in a Swift playground, I couldn't replicate the exact issue you are describing, however here are some suggestions that you could try.

    You could change the way you set up the stops in the gradient, I think it would make more sense to instead of shifting the gradient using the stops, shift the start point, i.e instead of starting from the top edge, start from the vertical center, something like this

    UIGraphicsBeginImageContext(image.size)
    var context = UIGraphicsGetCurrentContext()
    
    image.drawAtPoint(CGPointMake(0, 0))
    
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let locations:[CGFloat] = [0.0, 1.0]
    let bottom = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).CGColor
    let top = UIColor(red: 0, green: 0, blue: 0, alpha: 0).CGColor
    
    let gradient = CGGradientCreateWithColors(colorSpace,
                   [top, bottom], locations)
    
    let startPoint = CGPointMake(image.size.width / 2, image.size.height / 2)
    let endPoint = CGPointMake(image.size.width / 2, image.size.height)
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0)
    
    let finalImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    

    Notice locations is now 0 and 1, while the startPoint y coordinate has shifted downwards.

    Alternatively, look at passing kCGGradientDrawsBeforeStartLocation as an option to CGContextDrawLinearGradient, as that could also make a difference.

    0 讨论(0)
提交回复
热议问题