Created
November 30, 2015 18:45
-
-
Save grgcombs/f70b1f053b9cc3467e2d to your computer and use it in GitHub Desktop.
angleGradientImage.swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: 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