Advertisement
iamalizade

Color Cube v2

Jan 17th, 2016
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 6.40 KB | None | 0 0
  1. //
  2. //  ViewController.swift
  3. //  colorCube
  4. //
  5. //  Created by Orkhan Alizade on 17.01.16.
  6. //  Copyright © 2016 Orkhan Alizade. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import Accelerate
  11.  
  12. class ViewController: UIViewController {
  13.     @IBOutlet var imageView: UIImageView!
  14.  
  15.     override func viewDidLoad() {
  16.         super.viewDidLoad()
  17.         // Do any additional setup after loading the view, typically from a nib.
  18.        
  19.         imageView.image = UIImage(named: "[email protected]")
  20.     }
  21.  
  22.     override func didReceiveMemoryWarning() {
  23.         super.didReceiveMemoryWarning()
  24.         // Dispose of any resources that can be recreated.
  25.     }
  26.  
  27.     @IBAction func applyTheFilter(sender: AnyObject) {
  28.         let image: UIImage = UIImage(named: "[email protected]")!
  29.        
  30.         let ciImage = CIImage(image: image)
  31.        
  32. //        let filter = CIFilter(name: "CIPhotoEffectMono")
  33.        
  34.         let filter = colorCubeFilterFromLUT("K1.png")
  35.         filter?.setDefaults()
  36.         filter?.setValue(ciImage, forKey: kCIInputImageKey)
  37.        
  38.         let outputImage = filter?.outputImage
  39.        
  40.         let filteredImage = UIImage(CIImage: outputImage!)
  41.        
  42.         imageView.image = filteredImage
  43.     }
  44.    
  45.    
  46.    
  47.     func colorCubeFilterFromLUT(imageName : NSString) -> CIFilter? {
  48.        
  49.         let kDimension : UInt = 64
  50.        
  51.         let lutImage    = UIImage(named: imageName as String)!.CGImage
  52.         let lutWidth: UInt = UInt(CGImageGetWidth(lutImage!))
  53.         let lutHeight: UInt = UInt(CGImageGetHeight(lutImage!))
  54.         let rowCount    = lutHeight / kDimension
  55.         let columnCount = lutWidth / kDimension
  56.        
  57.         if ((lutWidth % kDimension != 0) || (lutHeight % kDimension != 0) || (rowCount * columnCount != kDimension)) {
  58.            
  59.             NSLog("Invalid colorLUT %@", imageName);
  60.             return nil
  61.         }
  62.        
  63.         let bitmap  = self.createRGBABitmapFromImage(lutImage!)
  64.         let size    = Int(kDimension) * Int(kDimension) * Int(kDimension) * sizeof(Float) * 4
  65.         let data    = UnsafeMutablePointer<Float>(malloc(Int(size)))
  66.        
  67.         var bitmapOffset : Int = 0
  68.         var z : UInt = 0
  69.        
  70.        
  71.         for (var row: UInt = 0; row < rowCount; row++)
  72.         {
  73.             for (var y: UInt = 0; y < kDimension; y++)
  74.             {
  75.                 var tmp = z
  76.                 for (var col: UInt = 0; col < columnCount; col++)
  77.                 {
  78.                     for (var x: UInt = 0; x < kDimension; x++) {
  79.                        
  80.                         let alpha   = Float(bitmap[Int(bitmapOffset)]) / 255.0
  81.                         let red     = Float(bitmap[Int(bitmapOffset+1)]) / alpha
  82.                         let green   = Float(bitmap[Int(bitmapOffset+2)]) / alpha
  83.                         let blue    = Float(bitmap[Int(bitmapOffset+3)]) / alpha
  84.                        
  85.                         var dataOffset = Int(z * kDimension * kDimension + y * kDimension + x) * 4
  86.                        
  87.                         data[dataOffset] = red
  88.                         data[dataOffset + 1] = green
  89.                         data[dataOffset + 2] = blue
  90.                         data[dataOffset + 3] = alpha
  91.                         bitmapOffset += 4
  92.                     }
  93.                     z++
  94.                 }
  95.                 z = tmp
  96.             }
  97.             z += columnCount
  98.         }
  99.        
  100.         let colorCubeData = NSData(bytesNoCopy: data, length: size, freeWhenDone: true)
  101.        
  102.         // create CIColorCube Filter
  103.         var filter = CIFilter(name: "CIColorCube")
  104.         filter!.setValue(colorCubeData, forKey: "inputCubeData")
  105.         filter!.setValue(kDimension, forKey: "inputCubeDimension")
  106.        
  107.         return filter
  108.     }
  109.    
  110.    
  111.     func createRGBABitmapFromImage(inImage: CGImage) -> UnsafeMutablePointer<Float> {
  112.        
  113.         //Get image width, height
  114.         let pixelsWide = CGImageGetWidth(inImage)
  115.         let pixelsHigh = CGImageGetHeight(inImage)
  116.         // Declare the number of bytes per row. Each pixel in the bitmap in this
  117.         // example is represented by 4 bytes; 8 bits each of red, green, blue, and
  118.         // alpha.
  119.         let bitmapBytesPerRow = Int(pixelsWide) * 4
  120.         let bitmapByteCount = bitmapBytesPerRow * Int(pixelsHigh)
  121.         // Use the generic RGB color space.
  122.         let colorSpace = CGColorSpaceCreateDeviceRGB()
  123.        
  124.        
  125.         var rawData: UInt8 = UnsafePointer<UInt8>(calloc(pixelsHigh * pixelsWide * 4, sizeof(Float))).memory
  126.         var bytesPerPixel: Int = 4
  127.         var bytesPerRow: Int = bytesPerPixel * pixelsWide
  128.         var bitsPerComponent: Int = 8
  129.        
  130.        
  131.         // Allocate memory for image data. This is the destination in memory
  132.         // where any drawing to the bitmap context will be rendered.
  133.         let bitmapData = malloc(Int(CUnsignedLong(bitmapByteCount))) // bitmap
  134.         let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Big.rawValue)
  135.        
  136.         // Create the bitmap context. We want pre-multiplied RGBA, 8-bits
  137.         // per component. Regardless of what the source image format is
  138.         // (CMYK, Grayscale, and so on) it will be converted over to the format
  139.         // specified here by CGBitmapContextCreate.
  140.         let context = CGBitmapContextCreate(bitmapData, 512, 512, 8, Int(bitmapBytesPerRow), colorSpace, bitmapInfo.rawValue)
  141.        
  142.        
  143.         let rect = CGRect(x:0, y:0, width:1000, height:1000)
  144.        
  145.         // Draw the image to the bitmap context. Once we draw, the memory
  146.         // allocated for the context for rendering will then contain the
  147.         // raw image data in the specified color space.
  148.         CGContextDrawImage(context, rect, inImage)
  149.        
  150.         // Now we can get a pointer to the image data associated with the bitmap
  151.         // context.
  152.         // var data = CGBitmapContextGetData(context)
  153.         // var dataType = UnsafeMutablePointer<Float>(data)
  154.         // return dataType
  155.        
  156.        
  157.         var convertedBitmap = malloc(Int(bitmapByteCount * sizeof(Float)))
  158.         print("BBB \(convertedBitmap)")
  159.         vDSP_vfltu8(UnsafePointer<UInt8>(bitmapData), 1, UnsafeMutablePointer<Float>(convertedBitmap), 1, vDSP_Length(bitmapByteCount))
  160.        
  161.         free(bitmapData)
  162.         return UnsafeMutablePointer<Float>(convertedBitmap)
  163.     }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement