Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 15.27 KB | None | 0 0
  1. //
  2. //  ViewController.swift
  3. //  PrototypeApp
  4. //
  5. //  Created by New User on 10/14/18.
  6. //  Copyright © 2018 New User. All rights reserved.
  7. //
  8.  
  9.  
  10. import UIKit
  11.  
  12. //code to identify color of pixels in RGB
  13. extension UIImage {
  14.     //this function give the best result
  15.     public func getPixelColor1(pos: CGPoint) -> UIColor {
  16.        
  17.         let pixelData = self.cgImage!.dataProvider!.data
  18.         let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
  19.        
  20.         let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
  21.        
  22.         let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
  23.         let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
  24.         let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
  25.         let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
  26.        
  27.         return UIColor(red: r, green: g, blue: b, alpha: a)
  28.         }
  29.    
  30.     func getPixelColor2(pos: CGPoint) -> UIColor {
  31.        
  32.         guard let cgImage = cgImage, let pixelData = cgImage.dataProvider?.data else { return UIColor.clear }
  33.         let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
  34.        
  35.         let bytesPerPixel = cgImage.bitsPerPixel / 8
  36.         // adjust the pixels to constrain to be within the width/height of the image
  37.         let y = pos.y > 0 ? pos.y - 1 : 0
  38.         let x = pos.x > 0 ? pos.x - 1 : 0
  39.         let pixelInfo = ((Int(self.size.width) * Int(y)) + Int(x)) * bytesPerPixel
  40.        
  41.         let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
  42.         let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
  43.         let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
  44.         let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
  45.        
  46.         return UIColor(red: r, green: g, blue: b, alpha: a)
  47.     }
  48.     // works for different image formats
  49.     func getPixelColor(_ image:UIImage, _ point: CGPoint) -> UIColor {
  50.         let cgImage : CGImage = image.cgImage!
  51.         guard let pixelData = CGDataProvider(data: (cgImage.dataProvider?.data)!)?.data else {
  52.             return UIColor.clear
  53.         }
  54.         let data = CFDataGetBytePtr(pixelData)!
  55.         let x = Int(point.x)
  56.         let y = Int(point.y)
  57.         let index = Int(image.size.width) * y + x
  58.         let expectedLengthA = Int(image.size.width * image.size.height)
  59.         let expectedLengthGrayScale = 2 * expectedLengthA
  60.         let expectedLengthRGB = 3 * expectedLengthA
  61.         let expectedLengthRGBA = 4 * expectedLengthA
  62.         let numBytes = CFDataGetLength(pixelData)
  63.         switch numBytes {
  64.         case expectedLengthA:
  65.             return UIColor(red: 0, green: 0, blue: 0, alpha: CGFloat(data[index])/255.0)
  66.         case expectedLengthGrayScale:
  67.             return UIColor(white: CGFloat(data[2 * index]) / 255.0, alpha: CGFloat(data[2 * index + 1]) / 255.0)
  68.         case expectedLengthRGB:
  69.             return UIColor(red: CGFloat(data[3*index])/255.0, green: CGFloat(data[3*index+1])/255.0, blue: CGFloat(data[3*index+2])/255.0, alpha: 1.0)
  70.         case expectedLengthRGBA:
  71.             return UIColor(red: CGFloat(data[4*index])/255.0, green: CGFloat(data[4*index+1])/255.0, blue: CGFloat(data[4*index+2])/255.0, alpha: CGFloat(data[4*index+3])/255.0)
  72.         default:
  73.             // unsupported format
  74.             return UIColor.clear
  75.         }
  76.     }
  77. }
  78. // get RGB value from UIColor
  79. extension UIColor {
  80.     var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
  81.         var red: CGFloat = 0
  82.         var green: CGFloat = 0
  83.         var blue: CGFloat = 0
  84.         var alpha: CGFloat = 0
  85.         getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  86.        
  87.         return (red, green, blue, alpha)
  88.     }
  89. }
  90.  
  91. extension UIView {
  92.    
  93.     // Using a function since `var image` might conflict with an existing variable
  94.     // (like on `UIImageView`)
  95.     func asImage() -> UIImage {
  96.         if #available(iOS 10.0, *) {
  97.             let renderer = UIGraphicsImageRenderer(bounds: bounds)
  98.             return renderer.image { rendererContext in
  99.                 layer.render(in: rendererContext.cgContext)
  100.             }
  101.         } else {
  102.             UIGraphicsBeginImageContext(self.frame.size)
  103.             self.layer.render(in:UIGraphicsGetCurrentContext()!)
  104.             let image = UIGraphicsGetImageFromCurrentImageContext()
  105.             UIGraphicsEndImageContext()
  106.             return UIImage(cgImage: image!.cgImage!)
  107.         }
  108.     }
  109. }
  110.  
  111.  
  112. class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate {
  113.    
  114.  
  115. // This is the label that displays the number when calculate is hit
  116.     @IBOutlet weak var piCalc: UILabel!
  117.    
  118.     var demoView = testingBoth()
  119.     var testingCircleClass = TestingCircleClass()
  120.     var pinchGesture = UIPinchGestureRecognizer()
  121.     var panGesture = UIPanGestureRecognizer()
  122.     var currentValue:Float = 1
  123.    
  124.     override func viewDidLoad() {
  125.         super.viewDidLoad()
  126.        
  127.        
  128.         // this code is for the filter (not yet integrated)
  129. //        if let image = UIImage(named: "pupil.jpg"){
  130. //           let originalImage = CIImage(image: image)
  131. //           let filter = CIFilter(name: "CISharpenLuminance")
  132. //           filter?.setDefaults()
  133.   //         filter?.setValue(originalImage, forKey: kCIInputImageKey)
  134.  //          if let outputImage = filter?.outputImage{
  135.  //               let newImage = UIImage(ciImage: outputImage)
  136. //                pupil.image = newImage
  137.        
  138.  
  139.        
  140.         self.demoView = testingBoth(frame: CGRect(x: self.view.frame.size.width/2-100.0/2, y: self.view.frame.size.height/2-100.0/2, width: 100.0, height: 100.0))
  141.        
  142.         self.testingCircleClass = TestingCircleClass(frame: CGRect(x: self.view.frame.size.width/2-100.0/2, y: self.view.frame.size.height/2-100.0/2, width: 100.0, height: 100.0))
  143.        
  144.         // Initialization code
  145.    
  146.        
  147.         self.demoView.isUserInteractionEnabled = true //pinching action setup
  148.         self.demoView.isMultipleTouchEnabled = true
  149.        
  150.         self.testingCircleClass.isUserInteractionEnabled = true //pinching action setup
  151.         self.testingCircleClass.isMultipleTouchEnabled = true
  152.        
  153.        
  154.         self.pinchGesture = UIPinchGestureRecognizer(target: self,action:#selector(handlePinch(recognizer:)))
  155.         self.panGesture = UIPanGestureRecognizer(target: self,action:#selector(handlePan(recognizer:)))
  156.         self.pinchGesture.delegate = self
  157.         self.panGesture.delegate = self
  158.         self.demoView.addGestureRecognizer(self.pinchGesture)
  159.         self.demoView.addGestureRecognizer(self.panGesture)
  160.        
  161.         self.testingCircleClass.addGestureRecognizer(self.pinchGesture)
  162.         self.testingCircleClass.addGestureRecognizer(self.panGesture)
  163.        
  164.         self.view.addSubview(testingCircleClass)
  165.         self.view.addSubview(demoView)
  166.        
  167.         }
  168.  
  169.     @IBAction func handlePinch(recognizer:UIPinchGestureRecognizer) {
  170.         //demoView.transform = CGAffineTransform(scaleX: recognizer.scale, y: recognizer.scale)
  171.         demoView.transform = demoView.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
  172.         testingCircleClass.transform = testingCircleClass.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
  173.         recognizer.scale = 1
  174.     }
  175.    
  176.     @IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
  177.         let translation = recognizer.translation(in: self.demoView)
  178.         let translationC = recognizer.translation(in: self.testingCircleClass)
  179.         if let view = recognizer.view {
  180.             view.center = CGPoint(x:view.center.x + translation.x,
  181.                                   y:view.center.y + translation.y)
  182.         }
  183.         if let view1 = recognizer.view {
  184.             view1.center = CGPoint(x:view1.center.x + translationC.x,
  185.                                   y:view1.center.y + translationC.y)
  186.         }
  187.         recognizer.setTranslation(CGPoint.zero, in: self.demoView)
  188.         recognizer.setTranslation(CGPoint.zero, in: self.testingCircleClass)
  189.     }
  190.  
  191. //Displays the image
  192.     @IBOutlet weak var pupil: UIImageView!
  193.    
  194.     @IBOutlet weak var testLabel: UILabel!
  195.     @IBOutlet weak var abnormalCheck: UISwitch!
  196.     @IBOutlet weak var textLabel: UILabel!
  197.    
  198.     @IBAction func buttonClicked(_ abnormalCheck: UISwitch) {
  199.         if abnormalCheck.isOn{
  200.             textLabel.text = "THE PUPIL IS ABNORMAL"
  201.         }
  202.         else{
  203.             textLabel.text = "THE PUPIL IS NORMAL"
  204.         }
  205.        
  206.     }
  207.        
  208.    
  209.     @IBOutlet weak var slider: UISlider!
  210.     @IBOutlet weak var slider1: UISlider!{
  211.         didSet{
  212.             slider1.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi/2))
  213.         }
  214.     }
  215.    
  216.     @IBAction func sliderMoved(_ slider: UISlider){
  217.         currentValue = slider.value
  218.         demoView.transform = CGAffineTransform(scaleX: CGFloat(currentValue), y: CGFloat(currentValue))
  219.     }
  220.    
  221.     @IBAction func slidersMoved(_ slider1: UISlider){
  222.         currentValue = slider1.value
  223.         testingCircleClass.transform = CGAffineTransform(scaleX: CGFloat(currentValue), y: CGFloat(currentValue))
  224.     }
  225.    
  226.    
  227.     // code to access camera: take picture button
  228.     @IBAction func camera(_ sender: Any) {
  229.         if UIImagePickerController.isSourceTypeAvailable(.camera){
  230.             let imagePicker = UIImagePickerController()
  231.             imagePicker.delegate = self
  232.             imagePicker.sourceType = .camera;
  233.             imagePicker.allowsEditing = true
  234.             //UIImageWriteToSavedPhotosAlbum(pupil.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) //save image
  235.             //imagePicker.cameraOverlayView = demoView
  236.             self.present(imagePicker, animated: true, completion: nil)
  237.         }
  238.     }
  239.     // code to access photo library: upload photo button
  240.     @IBAction func library(_ sender: Any) {
  241.         if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
  242.             let imagePicker = UIImagePickerController()
  243.             imagePicker.delegate = self
  244.             imagePicker.sourceType = .photoLibrary;
  245.             imagePicker.allowsEditing = true
  246.             self.present(imagePicker, animated: true, completion: nil)
  247.         }
  248.     }
  249.     //code to save image
  250.     @objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
  251.         if let error = error {
  252.             let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
  253.             ac.addAction(UIAlertAction(title: "OK", style: .default))
  254.             present(ac, animated: true)
  255.         } else {
  256.             let ac = UIAlertController(title: "Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert)
  257.             ac.addAction(UIAlertAction(title: "OK", style: .default))
  258.             present(ac, animated: true)
  259.         }
  260.     }
  261.    
  262.    
  263. // code to display selected image and crop
  264.    
  265.     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  266.         let image = info[UIImagePickerController.InfoKey.editedImage] as! UIImage
  267.         pupil.image = image
  268.         dismiss(animated:true, completion: nil)
  269.     }
  270.    
  271.    
  272.     //defines the colors that are "black" and part of the pupil. Not all pixels in the pupil will be exactly black, rather, a varying range of dark shades that appear black.
  273. // calculate pi button. Checks "x" number of pixels. "Black" points inside the circle are added to i, others are added to o. Divides to get ratio and displays this ratio.
  274.    
  275.     @IBAction func calculate(_ sender: Any) {
  276.         var i = 0
  277.         var o = 0
  278.         var x = 0
  279.         let image = pupil.image
  280.  
  281.         if image == nil {piCalc.text = "please select an image"}
  282.         else{
  283.        
  284.             //let frameSquare = UIView(frame: demoView.convert(demoView.frame, to: pupil.inputView)) //UI View out of square's location on image frame . demoView.bounds
  285.            
  286.             //adjust coordinates
  287.             let Xmin = Int(demoView.frame.minX) - Int(pupil.frame.minX)
  288.             let Ymin = Int(demoView.frame.minY) - Int(pupil.frame.minY)
  289.             let Xmax = Int(demoView.frame.maxX) - Int(pupil.frame.minX)
  290.             let Ymax = Int(demoView.frame.maxY) - Int(pupil.frame.minY)
  291.             let radius = Int(demoView.frame.size.width)/2
  292.           /*
  293.             let cXmin = Int(testingCircleClass.frame.minX) - Int(pupil.frame.minX)
  294.             let cYmin = Int(testingCircleClass.frame.minY) - Int(pupil.frame.minY)
  295.             let cXmax = Int(testingCircleClass.frame.maxX) - Int(pupil.frame.minX)
  296.             let cYmax = Int(testingCircleClass.frame.maxY) - Int(pupil.frame.minY)
  297.             let cradius = Int(testingCircleClass.frame.size.width)/2
  298.              
  299.              */
  300.            
  301.            
  302.             let xCenter = CGFloat(Xmin + radius)
  303.             let yCenter = CGFloat(Ymin + radius)
  304.             let circle1 = UIBezierPath(arcCenter: CGPoint(x: xCenter, y: yCenter), radius: CGFloat(radius), startAngle: CGFloat(0), endAngle: CGFloat(Double.pi * 2), clockwise: true)
  305.  
  306.             //find the color of the center point
  307.             let centerPoint = CGPoint(x:xCenter,y:yCenter)
  308.             let centerColor = image!.getPixelColor1(pos: centerPoint)
  309.            
  310.             var centerR: CGFloat = centerColor.rgba.red
  311.             var centerG: CGFloat = centerColor.rgba.green
  312.             var centerB: CGFloat = centerColor.rgba.blue
  313.            
  314.             while x < 3000{
  315.                
  316.                 let point = CGPoint(x:Int.random(in:Xmin...Xmax),y:Int.random(in:Ymin...Ymax))
  317.                 let color = image!.getPixelColor1(pos: point)
  318.                 var red: CGFloat = 0
  319.                 var green: CGFloat = 0
  320.                 var blue: CGFloat = 0
  321.                
  322.                 //defines the colors that are "black" and part of the pupil. Not all pixels in the pupil will be exactly black, rather, a varying range of dark shades that appear black.
  323.                
  324.                 red = color.rgba.red
  325.                 green = color.rgba.green
  326.                 blue = color.rgba.blue
  327.                 //edge case when the center is pure black
  328.                 if circle1.contains(point) && (centerR + centerG + centerB <= 0.02) {
  329.                     centerR = 0.05
  330.                     centerG = 0.05
  331.                     centerB = 0.05
  332.                 }
  333.                
  334.                 //adjust the values for contrast: right now 0.3 deviation from the color of the center pt
  335.                 //gray scale transformation: New grayscale image = ( (0.3 * R) + (0.59 * G) + (0.11 * B) ).
  336.                
  337.                 if circle1.contains(point) && (red + green + blue <= 1.4 * (centerR + centerG + centerB))
  338.                     //                    red < 1.3 * centerR &&
  339.                     //                    green < 1.3 * centerG &&
  340.                     //                    blue < 1.3 * centerB {
  341.  
  342.                 {
  343.                     i += 1}
  344.                 else{
  345.                     o += 1}
  346.                
  347.                 x += 1}
  348.            
  349.             let ratio = 4 * Float(i)/Float(x)
  350.  
  351.             piCalc.text = String(ratio)
  352.         }
  353.        
  354.     }
  355.    
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement