Skip to content

Instantly share code, notes, and snippets.

@grgcombs
Created November 30, 2015 18:45
Show Gist options
  • Save grgcombs/f70b1f053b9cc3467e2d to your computer and use it in GitHub Desktop.
Save grgcombs/f70b1f053b9cc3467e2d to your computer and use it in GitHub Desktop.
angleGradientImage.swift
//: angleGradientImage - Ported to Swift from http://stackoverflow.com/a/33991838/136582
import UIKit
import CoreImage
public func angleGradientImage(size: CGSize, radius: Float?, scale: CGFloat?, colors: (start:UIColor, end:UIColor)?) -> UIImage? {
let gradientRadius = (radius != nil) ? radius! : Float(min(size.width,size.height) - 2)
let gradientScale = (scale != nil) ? scale! : UIScreen.mainScreen().scale
let startColor : CIColor
let endColor : CIColor
if let _colors = colors {
startColor = CIColor(color: _colors.start)
endColor = CIColor(color: _colors.end)
}
else {
startColor = CIColor(red: 0.5, green: 0.5, blue: 0.5)
endColor = CIColor(color: UIColor.whiteColor())
}
UIGraphicsBeginImageContextWithOptions(size, false, gradientScale)
guard let contextImage = UIGraphicsGetImageFromCurrentImageContext().CGImage else {
return nil
}
let emptyImage = CIImage(CGImage: contextImage)
let kernelCode = "kernel vec4 circularGradientKernel(__color startColor, __color endColor, vec2 center, float radius) { \n" +
"vec2 point = destCoord() - center; \n" +
"float rsq = point.x * point.x + point.y * point.y; \n" +
"float theta = mod(atan(point.y, point.x), radians(360.0)); \n" +
"return (rsq < radius*radius) ? mix(startColor, endColor, 0.5+0.5*cos(4.0*theta)) : vec4(0.0, 0.0, 0.0, 1.0); \n" +
"}"
guard let kernel = CIColorKernel(string: kernelCode) else {
return nil
}
let extent = emptyImage.extent
let point = CGPointMake(CGRectGetMidX(extent), CGRectGetMidY(extent))
let vector = CIVector(CGPoint: point)
guard let ciOutput = kernel.applyWithExtent(extent, arguments: [startColor,endColor,vector, gradientRadius]) else {
return nil
}
let gradientImage = UIImage(CIImage: ciOutput, scale: gradientScale, orientation: UIImageOrientation.Up)
UIGraphicsEndImageContext()
return gradientImage
}
let gradientImage = angleGradientImage(CGSizeMake(256.0, 256.0), radius: nil, scale: nil, colors:nil)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment