2

にグラデーションを適用しUIImageています。一番下が暗くなり、中央がゆっくりとクリアまたはライトグレーに変わります。ほとんど問題ありませんが、このグラデーションの下でいくつかの場所で画像の色が反転するという問題があります。これは非常に迷惑に見えます。どうすれば解決できますか?

これがあなたの便宜のための私の方法です。

さまざまなブレンド モードを選択しようとしましたが、役に立ちません。もう 1 つの質問は、下部の黒をより集中的にするにはどうすればよいかということです。

このメソッドは、追加のコードなしで機能します。開始色は[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;
}
4

4 に答える 4

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 の配列を変更するだけです。

于 2013-04-23T13:11:28.333 に答える
5

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)

お役に立てば幸いです

于 2015-08-31T14:24:30.663 に答える
1

Navnath と Francis の回答に対するわずかな修正... gradient.frame を imageView.bounds に設定する必要があります。

gradient.frame = imageView.bounds
于 2016-03-03T03:09:57.383 に答える
0

希望する結果が得られるようにアルファを変更してみてください。レイヤーを既存の画像の上に配置します。

于 2013-04-23T12:40:11.453 に答える