web-dev-qa-db-ja.com

Core Graphic iPhoneによる透明(アルファ)グラデーション

コアグラフィックを使用して画像上に透明なグラデーション(アルファグラデーション)をプログラムで作成する方法を知っている人はいますか?画像の表示と保存の両方に必要です。

私が入手したいものの例: enter image description here

25
Pablosproject

QuartzCoreを使用して、マスク(グラデーションの透明度付き)をUIImageViewに適用できます。

UIImageView *myImageView = ["the image view"];
CAGradientLayer *l = [CAGradientLayer layer];
l.frame = myImageView.bounds;
 l.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0 green:0 blue:0 alpha:0] CGColor], (id)[[UIColor colorWithRed:0 green:0 blue:0 alpha:1] CGColor], nil];

l.startPoint = CGPointMake(0.0, 0.0f);
l.endPoint = CGPointMake(1.0f, 1.0f);

//you can change the direction, obviously, this would be top to bottom fade
myImageView.layer.mask = l; 

保存するには、キャンバスのコンテンツをUIImageに保存する方法を検索するだけで、StackOverflowで簡単に答えを見つけることができます。

またはSwift @Zazuの要求に応じたバージョン:

// Whatever you image view is, obviously not hardcoded like this
let imageView = UIImageView.init(image: UIImage(named: "Image"))
imageView.frame = CGRectMake(0, 0, 320, 480)
self.view.addSubview(imageView)
// Create the gradient layer
let gradientLayer = CAGradientLayer.init()
gradientLayer.frame = imageView.bounds
gradientLayer.colors = [
    UIColor.init(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0).CGColor,
    UIColor.init(colorLiteralRed: 0, green: 0, blue: 0, alpha: 1).CGColor]
// Whatever direction you want the fade. You can use gradientLayer.locations
// to provide an array of points, with matching colors for each point, 
// which lets you do other than just a uniform gradient.
gradientLayer.startPoint = CGPointMake(1.0, 0.0);
gradientLayer.endPoint = CGPointMake(0.0, 0.0);
// Use the gradient layer as the mask
imageView.layer.mask = gradientLayer;
45
Matthew Horst

Swift3-これが私にとってうまくいったことです。下の画像の20%だけがグラデーションで透明になる必要がありました。

    // Create the gradient layer
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = imageView.bounds

    gradientLayer.colors = [
        UIColor.white.withAlphaComponent(1).cgColor,
        UIColor.white.withAlphaComponent(0).cgColor]
    // Whatever direction you want the fade. You can use gradientLayer.locations
    // to provide an array of points, with matching colors for each point,
    // which lets you do other than just a uniform gradient.
    gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.80)
    gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
    // Use the gradient layer as the mask
    imageView.layer.mask = gradientLayer

enter image description here

6
Arijan

グラデーションのコアグラフィックソリューションはわかりませんが、Photoshopで画像を作成でき、右側が白で始まり、左側がアルファにフェードする場合は、コンテンツ画像の上にオーバーレイできます。

画像をオーバーレイするには、次のようにします

+ (UIImage*) addFadeOutToImage:(UIImage*)sourceImage
{
   UIGraphicsBeginImageContext(sourceImage.size);

   [sourceImage drawAtPoint:CGPointZero];

   UIImage* fadeAlphaImage = [UIImage imageNamed:@"fadedAlphaImage.png"];

   CGPoint fadeOutStartPoint = CGPointMake(sourceImage.size.width - fadeAlphaImage.size.width, 0);
   //assumes the fade image is the same height as the source
   [fadeAlphaImage drawAtPoint:fadeOutStartPoint];

   UIImage* fadeOutImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return fadeOutImage;
}

このコードは この質問 から適応されました

またはSwift @Zazuの要求に応じたバージョン:

// Whatever you image view is, obviously not hardcoded like this
let imageView = UIImageView.init(image: UIImage(named: "Image"))
imageView.frame = CGRectMake(0, 0, 320, 480)
self.view.addSubview(imageView)
// Create the gradient layer
let gradientLayer = CAGradientLayer.init()
gradientLayer.frame = imageView.bounds
gradientLayer.colors = [
    UIColor.init(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0).CGColor,
    UIColor.init(colorLiteralRed: 0, green: 0, blue: 0, alpha: 1).CGColor]
// Whatever direction you want the fade. You can use gradientLayer.locations
// to provide an array of points, with matching colors for each point, 
// which lets you do other than just a uniform gradient.
gradientLayer.startPoint = CGPointMake(1.0, 0.0);
gradientLayer.endPoint = CGPointMake(0.0, 0.0);
// Use the gradient layer as the mask
imageView.layer.mask = gradientLayer;
3
wattson12