2015-02-07 13 views
0

目的拉拔梯度与核心图形上UIImage的结果并不一致

我想画上的图像的顶部的线性渐变。

设置

我有一个函数调用imageWithGradient这需要的颜色和ImageView的把图像与描绘在梯度。我使用故事板添加的ImageView到视图。

问题

当尝试在模拟器上的代码,有时梯度将不会出现,有时阿尔法将不会出现(纯色),有时梯度将被翻转。由于我使用相同的颜色运行相同的代码,因此它应该对所有图像应用相同的渐变,但很少这样做。

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    var c1 = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.9).CGColor 
    var c2 = UIColor(red: 0, green: 0, blue: 0, alpha: 0).CGColor 

    imageWithGradient(self.imageView1, startColor: c1, endColor: c2) 
    imageWithGradient(self.imageView2, startColor: c1, endColor: c2) 
} 

func imageWithGradient(imgView:UIImageView, startColor: CGColor, endColor: CGColor){ 

    var img = UIImage(named:"sample.jpg")! 

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

    img.drawAtPoint(CGPointMake(0, 0)) 

    var colorSpace = CGColorSpaceCreateDeviceRGB() 

    var startColorComp = CGColorGetComponents(startColor) 
    var endColorComp = CGColorGetComponents(endColor) 
    var colorComps = [startColorComp[0], endColorComp[0]] 

    var locations:[CGFloat] = [0.0, 1.0] 

    var gradient = CGGradientCreateWithColorComponents(colorSpace, &colorComps, &locations, 2) 

    var startPoint = CGPointMake(img.size.width/2, img.size.height/2) 
    var endPoint = CGPointMake(img.size.width/2, img.size.height) 

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

    imgView.image = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 
} 

结果

Gradient Flipped Gradient doesn't appear on the right I changed the color and add another imageView with this one

回答

3

你基本上是通过在存储器对于彩色分量的未初始化块。

var colorComps = [startColorComp[0], endColorComp[0]] 

创建一个数组由每种颜色的第一分量的,所以2的部件(未连所需的组件)

此外上,传递2个元素的数组中为:

let gradient = CGGradientCreateWithColorComponents(colorSpace, colorComps, locations, 2) 

其中colorComps预计将接收8个浮点数组,因此其他6个浮点数基本上是随机存储内容,因此结果差别很大。

您可以使用此功能将颜色分量提取到实际颜色分量的数组中。此生成颜色的4种成分的迅速阵列(或然而,许多有,但它应该是4)

func CGColorComponents(color:CGColorRef) -> [CGFloat] { 
    let count = CGColorGetNumberOfComponents(color) 
    var comps = CGColorGetComponents(color) 

    var array = [CGFloat]() 

    for i in 0 ..< count { 
     array.append(comps.memory) 
     comps = comps.successor() 
    } 

    return array 
} 

您可以通过构建组件的相应的数组:

let startColorComp = CGColorComponents(startColor) 
let endColorComp = CGColorComponents(endColor) 
let colorComps = startColorComp + endColorComp 

认沽这一切放在一起,你可以创建会覆盖梯度图像上的功能:

func imageWithGradient(startColor: CGColor, endColor: CGColor) -> UIImage { 
    var img = UIImage(named:"img_0002.png")! 

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

    img.drawAtPoint(CGPointMake(0, 0)) 

    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    let componentCount = CGColorSpaceGetNumberOfComponents(colorSpace) 
    let startColorComp = CGColorComponents(startColor) 
    let endColorComp = CGColorComponents(endColor) 
    let colorComps = startColorComp + endColorComp 
    let locations:[CGFloat] = [0.0, 1.0] 

    let gradient = CGGradientCreateWithColorComponents(colorSpace, colorComps, locations, 2) 

    let startPoint = CGPointMake(img.size.width/2, img.size.height/2) 
    let endPoint = CGPointMake(img.size.width/2, img.size.height) 

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

    let image = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

    return image 
} 

不太你如何使用它,但你应该可以,如果你真的喜欢的功能了想维护你的语义。

更重要的是,只要使用CGGradientCreateWithColors代替:

let gradient = CGGradientCreateWithColors(colorSpace, [startColor, endColor], locations) 
+0

你的答案是非常明确的。非常感谢。我试图在图像上叠加一些文本,并使用渐变为文本提供一些对比,如Flipboard [link](http:// currentphotographer。COM /可湿性粉剂内容/上传/ 2011/12 /摄影 - 12月15-11-51-33-AM.png)。 您认为这是一种有效的方法吗?因为我必须将它应用于从服务器获取的大量照片。 – harinsa 2015-02-07 06:45:17