如何在iphone上的新图像上渲染径向渐变

如何在iphone上的新图像上渲染径向渐变,iphone,objective-c,uiimage,gradient,radial-gradients,Iphone,Objective C,Uiimage,Gradient,Radial Gradients,只是想知道如何在新的UIImage(iphone)上渲染径向渐变(点>圆)。 我看到了以下情况: 这让我觉得我需要使用CGShadingRef或CGGradientRef,并使用UIImage的“imageWithCGImage”构造函数从CG*转换为UIImage。。。但我不知道怎么做 非常感谢您的任何建议 您应该在与链接部分相同的文档中阅读。所有绘图都发生在图形上下文中。如果要创建具有径向渐变、线性渐变或其他任何内容的图像,则需要: 使用为图像创建图形上下文 执行希望在图像中显示的任何图

只是想知道如何在新的UIImage(iphone)上渲染径向渐变(点>圆)。 我看到了以下情况:

这让我觉得我需要使用CGShadingRef或CGGradientRef,并使用UIImage的“imageWithCGImage”构造函数从CG*转换为UIImage。。。但我不知道怎么做

非常感谢您的任何建议

您应该在与链接部分相同的文档中阅读。所有绘图都发生在图形上下文中。如果要创建具有径向渐变、线性渐变或其他任何内容的图像,则需要:

  • 使用为图像创建图形上下文
  • 执行希望在图像中显示的任何图形
  • 调用以从上下文中获取图像。这将为您提供一个UIImage,因此无需从CGImage转换
  • 调用以清理上下文

    • 好的,这是工作解决方案的要点,如果我遗漏了什么,请告诉我(例如释放句柄/引用)

      也在我的博客上发布:


      您还可以在iOS5+中使用CoreImage并使用Vignette过滤器

      - (UIImage *)vignetteImageOfSize:(CGSize)size withImage:(UIImage *)image {  
          UIGraphicsBeginImageContextWithOptions(size, YES, 0);
          CGContextRef context = UIGraphicsGetCurrentContext();
          CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
          CGContextFillRect(context, CGRectMake(0.0, 0.0, size.width, size.height));
      
          CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
          CGPoint origin = [coreImage extent].origin;
          CGAffineTransform translation =
          CGAffineTransformMakeTranslation(-origin.x, -origin.y);
          coreImage = [coreImage imageByApplyingTransform:translation];
      
          CIFilter *vignette = [[CIFilter filterWithName:@"CIVignette"] retain];
          [vignette setValue:@1.5 forKey:@"inputRadius"];
          [vignette setValue:@1.5 forKey:@"inputIntensity"];
          [vignette setValue:coreImage forKey:@"inputImage"];
      
          UIImage *vignetteImage = [UIImage imageWithCIImage:vignette.outputImage];
          [vignette release];
      
          CGRect imageFrame = CGRectMake(0.0, 0.0, size.width, size.height);
          [image drawInRect:imageFrame];
          UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return renderedImage;
      }
      

      我在这里编写了这个简化的方法(例如,将其放入UIImage类别中)

      示例用法:

      // resulting image size 128x128 px
      UIImage* myRadialImage = [UIImage radialGradientImageWithRadius:128.f StartColor:[UIColor greenColor] EndColor:nil ApplyScreenScale:NO]; 
      
      // resulting image size 256x256 px on normal retina display, or 384x384 on iPhone 6 or gre 
      UIImage* myRadialImage = [UIImage radialGradientImageWithRadius:128.f StartColor:[UIColor greenColor] EndColor:[UIColor redColor] ApplyScreenScale:YES]; 
      

      希望有用

      为UIView设置径向渐变颜色

      对于梯度

      extension UIColor {
      func colorWithRadialGradient(frame: CGRect, colors: [UIColor]) -> UIColor {
          if frame.width != 0.0 && frame.height != 0.0 {
              let backgroundGradientLayer = CAGradientLayer()
              backgroundGradientLayer.frame = frame
              let cgColors = colors.map({$0.cgColor})
              backgroundGradientLayer.colors = cgColors
              backgroundGradientLayer.type = kCAGradientLayerRadial
              backgroundGradientLayer.startPoint = CGPoint(x: 0.5, y: 0.1)
              UIGraphicsBeginImageContext(backgroundGradientLayer.bounds.size)
              backgroundGradientLayer.render(in: UIGraphicsGetCurrentContext()!)
              let backgroundColorImage = UIGraphicsGetImageFromCurrentImageContext()
              UIGraphicsEndImageContext()
              return UIColor(patternImage: backgroundColorImage!)
          }
          return .clear
          }
      }
      
      (可选)对于外部阴影

      extension UIView
      {
      func setGreenCircularShadow() {
          let greenGradient = [UIColor(red: 13/255.0, green: 160/255.0, blue: 110/255.0, alpha: 0.8),UIColor(red: 7/255.0, green: 200/255.0, blue: 128/255.0, alpha: 1.0),UIColor(red: 7/255.0, green: 200/255.0, blue: 128/255.0, alpha: 1.0), UIColor(red: 13/255.0, green: 160/255.0, blue: 110/255.0, alpha: 0.8)]
          self.backgroundColor        = UIColor().colorWithRadialGradient(frame: self.bounds, colors: greenGradient)
          self.layer.shadowColor      = UIColor(red: 7.0/255.0, green: 200.0/255.0, blue: 128.0/255.0, alpha: 1.0).cgColor
          self.layer.shadowOpacity    = 0.33
          self.layer.shadowOffset     = CGSize(width: 0, height: 5.0)
          self.layer.shadowRadius     = 10
          self.layer.shadowPath       = UIBezierPath(rect: self.bounds).cgPath
         }
      }
      
      设置为UIVIEW

      view.layer.cornerRadius = 5.0
      view.setGreenCircularShadow()
      

      但是图像应用在哪里?该方法的目标是什么?
      extension UIView
      {
      func setGreenCircularShadow() {
          let greenGradient = [UIColor(red: 13/255.0, green: 160/255.0, blue: 110/255.0, alpha: 0.8),UIColor(red: 7/255.0, green: 200/255.0, blue: 128/255.0, alpha: 1.0),UIColor(red: 7/255.0, green: 200/255.0, blue: 128/255.0, alpha: 1.0), UIColor(red: 13/255.0, green: 160/255.0, blue: 110/255.0, alpha: 0.8)]
          self.backgroundColor        = UIColor().colorWithRadialGradient(frame: self.bounds, colors: greenGradient)
          self.layer.shadowColor      = UIColor(red: 7.0/255.0, green: 200.0/255.0, blue: 128.0/255.0, alpha: 1.0).cgColor
          self.layer.shadowOpacity    = 0.33
          self.layer.shadowOffset     = CGSize(width: 0, height: 5.0)
          self.layer.shadowRadius     = 10
          self.layer.shadowPath       = UIBezierPath(rect: self.bounds).cgPath
         }
      }
      
      view.layer.cornerRadius = 5.0
      view.setGreenCircularShadow()