应用渐变到UIImage – 如何去除颜色反转?

我正在对UIImage应用渐变,所有我想要它在底部黑暗,并慢慢转向清除或浅灰色的中间。 这大体上是好的,但我有一个问题,我的图像颜色在这个梯度下的一些地方倒置。 这看起来很烦人。 我该如何解决?

这是我方便您的方法。

我试着select不同的混合模式,但是没有帮助。 另一个问题是,如何让底部的黑色更密集?

这种方法将无需任何额外的代码。 开始颜色是[UIColor blackColor] ,结束颜色是[UIColor clearColor]

 - (UIImage *)imageWithGradient:(UIImage *)img startColor:(UIColor *)color1 endColor:(UIColor *)color2 { UIGraphicsBeginImageContextWithOptions(img.size, NO, img.scale); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0, img.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextSetBlendMode(context, kCGBlendModeDarken); // tried normal here, same results CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height); CGContextDrawImage(context, rect, img.CGImage); // Create gradient NSArray *colors = [NSArray arrayWithObjects:(id)color1.CGColor, (id)color2.CGColor, nil]; CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColors(space, (__bridge CFArrayRef)colors, NULL); // Apply gradient CGContextClipToMask(context, rect, img.CGImage); CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(0, img.size.height / 2.0), 0); UIImage *gradientImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGGradientRelease(gradient); CGColorSpaceRelease(space); return gradientImage; } 

尝试这个

 // Set image over layer CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = imageView.frame; // Add colors to layer UIColor *centerColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.25]; UIColor *endColor = [UIColor grayColor]; gradient.colors = [NSArray arrayWithObjects: (id)[endColor CGColor], (id)[centerColor CGColor], (id)[endColor CGColor], nil]; [imageView.layer insertSublayer:gradient atIndex:0]; 

只需更改gradient.colors数组取决于您的要求。

在Swift中Navnath的答案

 var gradient = CAGradientLayer() gradient.frame = imageView.frame gradient.colors = [ UIColor(white: 0, alpha: 0.25).CGColor, UIColor.grayColor().CGColor, UIColor(white: 0, alpha: 0.25).CGColor ] imageView.layer.insertSublayer(gradient, atIndex: 0) 

希望你觉得它有用

对Navnath和Francis的答案稍微修正… gradient.frame需要设置为imageView.bounds:

 gradient.frame = imageView.bounds 

试着改变alpha来得到想要的结果。 将图层放在现有图像的顶部。