Skip to content

Instantly share code, notes, and snippets.

@skoirala
Created January 24, 2016 18:49
Show Gist options
  • Save skoirala/db6001459b13af3d455f to your computer and use it in GitHub Desktop.
Save skoirala/db6001459b13af3d455f to your computer and use it in GitHub Desktop.
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