Created
January 24, 2016 18:49
-
-
Save skoirala/db6001459b13af3d455f to your computer and use it in GitHub Desktop.
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
var backgroundColor: [UInt8] = [0, 0, 0, 0] | |
let GaussianBlurKernel: [Int16] = | |
[ 1, 4, 6, 4, 1, | |
4, 16, 24, 16, 4, | |
6, 24, 36, 24, 6, | |
4, 16, 24, 16, 4, | |
1, 4, 6, 4, 1 | |
] | |
let EmbossKernel: [Int16] = | |
[ | |
-2, 0, 0, | |
0, 1, 0, | |
0, 0, 2 | |
]; | |
let EdgeDetectionKernel: [Int16] = [ | |
-1, -1, -1, | |
0, 0, 0, | |
1, 1, 1 | |
]; | |
func embossImage(image: UIImage, bias: Int) -> UIImage { | |
var inputBuffer = createInputBuffer(fromImage: image) | |
var outputBuffer = createOutputBuffer(fromInputBuffer: inputBuffer) | |
convolve(&inputBuffer, outputBuffer: &outputBuffer, kernel:EmbossKernel, withBias: Int32(bias)) | |
return createImageFromBuffer(outputBuffer) | |
} | |
func detectEdge(image: UIImage, bias: Int) -> UIImage { | |
var inputBuffer = createInputBuffer(fromImage: image) | |
var outputBuffer = createOutputBuffer(fromInputBuffer: inputBuffer) | |
convolve(&inputBuffer, outputBuffer: &outputBuffer, kernel: EdgeDetectionKernel, withBias: Int32(bias)) | |
return createImageFromBuffer(outputBuffer) | |
} | |
func blurImage(image: UIImage, blurRadius: Int) -> UIImage { | |
var inputBuffer = createInputBuffer(fromImage: image) | |
var outputBuffer = createOutputBuffer(fromInputBuffer: inputBuffer) | |
boxConvolve(&inputBuffer, outputBuffer: &outputBuffer, inputRadius: blurRadius) | |
return createImageFromBuffer(outputBuffer) | |
} | |
func tentBlur(image: UIImage, blurRadius: Int) -> UIImage { | |
var inputBuffer = createInputBuffer(fromImage: image) | |
var outputBuffer = createOutputBuffer(fromInputBuffer: inputBuffer) | |
boxConvolve(&inputBuffer, outputBuffer: &outputBuffer, inputRadius: blurRadius) | |
return createImageFromBuffer(outputBuffer) | |
} | |
func createInputBuffer(fromImage image: UIImage) -> vImage_Buffer { | |
let cgImage = image.CGImage! | |
let dataProvider = CGImageGetDataProvider(cgImage)! | |
let data = CGDataProviderCopyData(dataProvider)! | |
let bytes = CFDataGetBytePtr(data) | |
let inputBuffer = vImage_Buffer(data: UnsafeMutablePointer<Void>(bytes), height: vImagePixelCount(CGImageGetHeight(cgImage)), width: vImagePixelCount(CGImageGetWidth(cgImage)), rowBytes: CGImageGetBytesPerRow(cgImage)) | |
return inputBuffer | |
} | |
func createOutputBuffer(fromInputBuffer inputBuffer: vImage_Buffer) -> vImage_Buffer { | |
let size = inputBuffer.rowBytes * Int(inputBuffer.height) * 8 | |
let pixelBuffer = UnsafeMutablePointer<Void>.alloc(size) | |
let outputBuffer = vImage_Buffer(data: pixelBuffer, height: inputBuffer.height, width: inputBuffer.width, rowBytes: inputBuffer.rowBytes) | |
return outputBuffer | |
} | |
func convolve(inputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
outputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
kernel:[Int16], | |
withBias bias: Int32) { | |
var kernelPointer = kernel | |
vImageConvolveWithBias_ARGB8888(inputBuffer, outputBuffer, nil, 0, 0, &kernelPointer, 3, 3, 1, bias, backgroundColor, UInt32(kvImageBackgroundColorFill)) | |
} | |
func tentConvolve(inputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
outputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
inputRadius: Int) | |
{ | |
var color: [UInt8] = [1, 0, 0, 1] | |
var radius = UInt32(floor((Double(inputRadius) * 3 * sqrt(2 * M_PI) / 4 + 0.5) / 2)) | |
radius |= 1; // force radius to be odd so that the three box-blur methodology works. | |
vImageTentConvolve_ARGB8888(inputBuffer, outputBuffer, nil, 0, 0, radius, radius, &color, UInt32(kvImageBackgroundColorFill)) | |
} | |
func boxConvolve(inputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
outputBuffer: UnsafeMutablePointer<vImage_Buffer>, | |
inputRadius: Int) | |
{ | |
var radius = UInt32(floor((Double(inputRadius) * 3 * sqrt(2 * M_PI) / 4 + 0.5) / 2)) | |
radius |= 1; // force radius to be odd so that the three box-blur methodology works. | |
vImageBoxConvolve_ARGB8888(inputBuffer, outputBuffer, nil, 0, 0, radius, radius, &backgroundColor, UInt32(kvImageBackgroundColorFill)) | |
} | |
func createImageFromBuffer(buffer: vImage_Buffer) -> UIImage | |
{ | |
let colorSpace = CGColorSpaceCreateDeviceRGB() | |
let context = CGBitmapContextCreate(buffer.data, Int(buffer.width), Int(buffer.height), 8, buffer.rowBytes, colorSpace, CGImageAlphaInfo.PremultipliedLast.rawValue) | |
let cgImage = CGBitmapContextCreateImage(context)! | |
let image = UIImage(CGImage: cgImage) | |
return image | |
} | |
let image = UIImage(named: "CTT.png")! | |
blurImage(image, blurRadius: 10) | |
embossImage(image, bias: 12) | |
detectEdge(image, bias: 10) | |
tentBlur(image, blurRadius: 10) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment