Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @IBAction func applyTheFilter(sender: AnyObject) {
- let image: UIImage = UIImage(named: "me.jpg")!
- let ciImage = CIImage(image: image)
- // let filter = CIFilter(name: "CIPhotoEffectMono")
- let filter = colorCubeFilterFromLUT("X400.png")
- filter?.setDefaults()
- filter?.setValue(ciImage, forKey: kCIInputImageKey)
- let outputImage = filter?.outputImage
- let filteredImage = UIImage(CIImage: outputImage!)
- imageView.image = filteredImage
- }
- func colorCubeFilterFromLUT(imageName : NSString) -> CIFilter? {
- let kDimension : UInt = 64
- let lutImage = UIImage(named: imageName as String)!.CGImage
- let lutWidth = CGImageGetWidth(lutImage!)
- let lutHeight = CGImageGetHeight(lutImage!)
- let rowCount = lutHeight / Int(kDimension)
- let columnCount = lutWidth / Int(kDimension)
- if ((lutWidth % Int(kDimension) != 0) || (lutHeight % Int(kDimension) != 0) || (rowCount * columnCount != Int(kDimension))) {
- NSLog("Invalid colorLUT %@", imageName);
- return nil
- }
- let bitmap = self.createRGBABitmapFromImage(lutImage!)
- let size = Int(kDimension) * Int(kDimension) * Int(kDimension) * sizeof(Float) * 4
- let data = UnsafeMutablePointer<Float>(malloc(size))
- var bitmapOffset : Int = 0
- var z : Int = 0
- for (var row: UInt = 0; Int(row) < rowCount; row++)
- {
- for (var y: Int = 0; y < Int(kDimension); y++)
- {
- var tmp = z
- for (var col: UInt = 0; Int(col) < columnCount; col++)
- {
- for (var x: Int = 0; x < Int(kDimension); x++) {
- let alpha = Float(bitmap[Int(bitmapOffset)]) / 255.0
- let red = Float(bitmap[Int(bitmapOffset+1)]) / 255.0
- let green = Float(bitmap[Int(bitmapOffset+2)]) / 255.0
- let blue = Float(bitmap[Int(bitmapOffset+3)]) / 255.0
- let firstPart = z * Int(kDimension) * Int(kDimension)
- let secondPart = y * Int(kDimension)
- let dataOffset = Int(firstPart + secondPart + x) * 4
- data[dataOffset] = red
- data[dataOffset + 1] = green
- data[dataOffset + 2] = blue
- data[dataOffset + 3] = alpha
- bitmapOffset += 4
- }
- z++
- }
- z = tmp
- }
- z += columnCount
- }
- let colorCubeData = NSData(bytesNoCopy: data, length: size, freeWhenDone: true)
- // create CIColorCube Filter
- var filter = CIFilter(name: "CIColorCube")
- filter!.setValue(colorCubeData, forKey: "inputCubeData")
- filter!.setValue(kDimension, forKey: "inputCubeDimension")
- return filter
- }
- func createRGBABitmapFromImage(inImage: CGImage) -> UnsafeMutablePointer<Float> {
- //Get image width, height
- let pixelsWide = CGImageGetWidth(inImage)
- let pixelsHigh = CGImageGetHeight(inImage)
- // Declare the number of bytes per row. Each pixel in the bitmap in this
- // example is represented by 4 bytes; 8 bits each of red, green, blue, and
- // alpha.
- let bitmapBytesPerRow = Int(pixelsWide) * 4
- let bitmapByteCount = bitmapBytesPerRow * Int(pixelsHigh)
- // Use the generic RGB color space.
- let colorSpace = CGColorSpaceCreateDeviceRGB()
- // Allocate memory for image data. This is the destination in memory
- // where any drawing to the bitmap context will be rendered.
- let bitmapData = malloc(Int(CUnsignedLong(bitmapByteCount))) // bitmap
- let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
- // Create the bitmap context. We want pre-multiplied RGBA, 8-bits
- // per component. Regardless of what the source image format is
- // (CMYK, Grayscale, and so on) it will be converted over to the format
- // specified here by CGBitmapContextCreate.
- let context = CGBitmapContextCreate(bitmapData, Int(pixelsWide), Int(pixelsHigh), 8, Int(bitmapBytesPerRow), colorSpace, bitmapInfo.rawValue)
- let rect = CGRect(x:0, y:0, width:Int(pixelsWide), height:Int(pixelsHigh))
- // Draw the image to the bitmap context. Once we draw, the memory
- // allocated for the context for rendering will then contain the
- // raw image data in the specified color space.
- CGContextDrawImage(context, rect, inImage)
- // Now we can get a pointer to the image data associated with the bitmap
- // context.
- // var data = CGBitmapContextGetData(context)
- // var dataType = UnsafeMutablePointer<Float>(data)
- // return dataType
- var convertedBitmap = malloc(Int(bitmapByteCount * sizeof(Float)))
- vDSP_vfltu8(UnsafePointer<UInt8>(bitmapData), 1, UnsafeMutablePointer<Float>(convertedBitmap), 1, vDSP_Length(bitmapByteCount))
- free(bitmapData)
- return UnsafeMutablePointer<Float>(convertedBitmap)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement