2015-03-17 12 views
5

Próbuję zastosować gradient do UIImage przy użyciu CoreGraphic; jednak wynik, jaki otrzymałem, nie jest zbyt miły. Chcę utworzyć czarny do przezroczystego gradientu u dołu obrazu, aby utworzyć kontrast dla mnie, aby umieścić jakiś tekst. Jednak gradient, który udało mi się uzyskać, nie pasuje do obrazu; wyraźnie widać separację w centrum. Rezultat, którego szukam, jest podobny do tej aplikacji: http://capptivate.co/2014/02/17/yummly-3/ Jak zastosować gradient, aby to osiągnąć? (Muszę to zastosować do dużej ilości zdjęć).Stosowanie gradientu do UIImage Smoothly

Moja Wynik:

enter image description here

Oto mój kod:

func imageWithGradient(img:UIImage!) -> UIImage{ 

    UIGraphicsBeginImageContext(img.size) 
    var context = UIGraphicsGetCurrentContext() 

    img.drawAtPoint(CGPointMake(0, 0)) 

    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    let locations:[CGFloat] = [0.50, 1.0] 
    //1 = opaque 
    //0 = transparent 
    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(img.size.width/2, 0) 
    let endPoint = CGPointMake(img.size.width/2, img.size.height) 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

    return image 
} 
+1

Spróbuj ustawienie Y startowy a końcem poza zakresem wielkości tak gradientu obrazu będzie wyższa, a różnica w kolorze będą mniej zauważalne. Na przykład ustaw startPoint Y na '-img.size.height/4' i endPoint' img.size.height * 1,25'. Jeśli kolor na końcu ekranu wygląda zbyt przezroczysto, zwiększ alfa dolną kolorową odrobinę, tak samo jak –

+0

@zellb Próbowałem, a linia pośrodku nadal jest dość widoczna. W przeciwieństwie do aplikacji w linku pokazałem, co jest bardzo płynne. Czy masz pojęcie, jaki jest zastosowany filtr? A może lepiej po prostu stworzyć filtr w Photoshopie i zastosować go na innym obrazie. – harinsa

Odpowiedz

0

Próbowałem to w szybkim zabaw, nie mogłem powtórzyć dokładnie problem opisujesz, jednak Oto kilka sugestii, które możesz wypróbować.

Możesz zmienić sposób ustawiania przystanków w gradiencie, myślę, że bardziej sensowny byłby zamiast przesuwania gradientu za pomocą przystanków, przesunięcie punktu początkowego, tj. Zamiast zaczynać od górnej krawędzi, start od pionowego centrum, coś takiego

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() 

lokalizacjach ogłoszenie jest teraz 0 i 1, natomiast startPoint współrzędna y przesunął się w dół.

Alternatywnie, spójrz na przekazanie kCGGradientDrawsBeforeStartLocation jako opcji do CGContextDrawLinearGradient, ponieważ może to również zrobić różnicę.

9

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

dzięki! Działa idealnie dla mnie. Po prostu zmieniam lokalizacje = [0.7, 1.0], aby pokryć dolną część obrazu. – abanet