应用渐变到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来得到想要的结果。 将图层放在现有图像的顶部。