2013-04-23 45 views
2

我正在將梯度應用到UIImage,我希望它在底部變黑,並緩慢地在中間變爲清晰或淺灰色。 大體上可以,但我有一個問題,我的圖像顏色在某些地方在此漸變下反轉。這看起來很煩人。我如何解決這個問題?將漸變應用於UIImage - 如何去除顏色反轉?

這是我的方法,爲您提供方便。

我試過挑選不同的混合模式,但它沒有幫助。另一個問題是,如何讓底部的黑色更加密集?

該方法無需任何額外的代碼即可工作。 啓動顏色[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; 
} 

回答

13

試試這個

// 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取決於您的需求。

+2

對於試圖在Swift中實現相同功能的人(imageView with gradient),請確保您的顏色數組的類型是[CGColor]而不是[UIColor]。我沒有收到任何錯誤,但相反,這段代碼被忽略了(視圖不受影響)。發現它[在這個答案](http://stackoverflow.com/a/24380968/1423874)。 – Shahar 2014-10-18 22:58:11

0

嘗試只是改變了阿爾法以獲得期望的結果。將圖層放在現有圖像的頂部。

5

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) 

希望你覺得它有用

+1

謝謝;)但它是grayColor而不是greyColor – Matz 2016-02-10 11:00:40

+0

@Matz謝謝你的更正! – 2016-02-10 17:27:54

1

小幅回調至Navnath的和弗朗西斯的回答...... gradient.frame需要設置到imageView.bounds:

gradient.frame = imageView.bounds