Last active
July 21, 2022 01:08
-
-
Save cruinh/df5a2f59210863d201a2 to your computer and use it in GitHub Desktop.
GlowFilter for CoreImage in Swift
This file contains 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
// | |
// GlowFilter.swift | |
// based on ENHGlowFilter from http://stackoverflow.com/a/21586439/114409 | |
// | |
// Created by Matthew Hayes on 12/27/15. | |
// | |
import Foundation | |
import UIKit | |
import CoreImage | |
class GlowFilter : CIFilter | |
{ | |
var glowColor : UIColor! | |
var glowSize : CGFloat = 1.2 | |
var inputImage : CIImage? | |
var inputRadius : NSNumber? | |
var inputCenter : CIVector? | |
override var outputImage: CIImage? | |
{ | |
get | |
{ | |
guard let inputImage = inputImage else { return nil } | |
let monochromeFilter = CIFilter(name: "CIColorMatrix") | |
var red : CGFloat = 0 | |
var green : CGFloat = 0 | |
var blue : CGFloat = 0 | |
var alpha : CGFloat = 0 | |
glowColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) | |
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: red), forKey: "inputRVector") | |
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: green), forKey: "inputGVector") | |
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: blue), forKey: "inputBVector") | |
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: alpha), forKey: "inputAVector") | |
monochromeFilter?.setValue(inputImage, forKey: "inputImage") | |
var glowImage = monochromeFilter?.outputImage | |
let inputCenterX = inputCenter?.X ?? 0 | |
let inputCenterY = inputCenter?.Y ?? 0 | |
if inputCenterX > 0 | |
{ | |
var transform = CGAffineTransformTranslate(CGAffineTransformIdentity, inputCenterX, inputCenterY) | |
transform = CGAffineTransformScale(transform, glowSize, glowSize) | |
transform = CGAffineTransformTranslate(transform, -inputCenterX, -inputCenterY) | |
let affineTransformFilter = CIFilter(name: "CIAffineTransform") | |
affineTransformFilter?.setDefaults() | |
affineTransformFilter?.setValue(NSValue(CGAffineTransform: transform), forKey: "inputTransform") | |
affineTransformFilter?.setValue(glowImage, forKey: "inputImage") | |
glowImage = affineTransformFilter?.outputImage | |
} | |
let gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") | |
gaussianBlurFilter?.setDefaults() | |
gaussianBlurFilter?.setValue(glowImage, forKey: "inputImage") | |
gaussianBlurFilter?.setValue(inputRadius ?? 10, forKey: "inputRadius") | |
glowImage = gaussianBlurFilter?.outputImage | |
let blendFilter = CIFilter(name: "CISourceOverCompositing") | |
blendFilter?.setDefaults() | |
blendFilter?.setValue(glowImage, forKey: "inputBackgroundImage") | |
blendFilter?.setValue(inputImage, forKey: "inputImage") | |
glowImage = blendFilter?.outputImage | |
return glowImage | |
} | |
} | |
override init() | |
{ | |
super.init() | |
glowColor = UIColor.whiteColor() | |
} | |
required init?(coder aDecoder: NSCoder) | |
{ | |
super.init(coder: aDecoder) | |
glowColor = UIColor.whiteColor() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
example usage: