从触摸位置检测图像颜色

时间:2019-07-29 18:52:36

标签: swift xcode drawing uitouch

我正在尝试构建一个可以用作虚拟留言簿的简单绘图应用程序。香港专业教育学院设法把一些简单的东西放在一起,使用户可以绘制到UIImage上,但是我想不出一种方法来擦除某人创建的图形而不使用我创建为白色的橡皮擦功能。我想设置一个图像,但是我需要找出一种方法,使橡皮擦能够根据用户擦除手指以匹配图像时所处的位置来检测要使用的正确颜色。

我的橡皮擦当前更新一组变量(红色,绿色,蓝色),橡皮擦功能为@IBAction功能橡皮擦

我尝试了一些过时的功能

//
//  SecondViewController.swift
//  Guest Book
//
//  Created by Stephen Clifford on 25/07/2019.
//  Copyright © 2019 Stephen Clifford. All rights reserved.
//

import Foundation
import UIKit

class SecondViewController: UIViewController {


@IBOutlet weak var toolicon: UIButton!
@IBOutlet var imageView: UIImageView!


var lastPoint = CGPoint.zero
var swiped = false
var red:CGFloat = 0.00
var green:CGFloat = 0.00
var blue:CGFloat = 0.00
var alpha:CGFloat = 1
var lw:CGFloat = 2.5
var tool:UIImageView!
var isDrawing = true
override func viewDidLoad() {
    super.viewDidLoad()

    tool = UIImageView()
    tool.frame = CGRect(x: self.view.bounds.size.width, y: self.view.bounds.height, width: 75, height: 75)
    tool.image = #imageLiteral(resourceName: "pen")
    self.view.addSubview(tool)
}

@IBAction func eraser(_ sender: AnyObject) {
    if (isDrawing) {
        (red,green,blue) = (1,1,1)
        tool.image = #imageLiteral(resourceName: "eraser")
        toolicon.setImage(#imageLiteral(resourceName: "pen"), for: .normal)
        (lw) = (50)


    } else {
        (red,green,blue) = (0,0,0)
        tool.image = #imageLiteral(resourceName: "pen")
        toolicon.setImage(#imageLiteral(resourceName: "eraser"), for: .normal)
        (lw) = (2.5)
    }

    isDrawing = !isDrawing
}

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

@IBAction func save(_ sender: AnyObject) {
    if let image = imageView.image {
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        self.imageView.image = nil

        // the alert view
        let alert = UIAlertController(title: "", message: "Thank you, your guestbook entry has been saved. Redirecting you the home page", preferredStyle: .alert)
        self.present(alert, animated: true, completion: nil)

        // change to desired number of seconds (in this case 5 seconds)
        let when = DispatchTime.now() + 2.5
        DispatchQueue.main.asyncAfter(deadline: when){
            // your code with delay
            alert.dismiss(animated: true, completion: nil)

        }
        delay(3.0) {
            // do stuff
            self.performSegue(withIdentifier: "savetocam", sender: nil)
        }
    }
}
@IBAction func lineSize(_ sender: AnyObject) {
    if sender.tag == 8 {
        (lw) = (1)
    } else if sender.tag == 9 {
        (lw) = (2.5)
    } else if sender.tag == 10 {
        (lw) = (5)
    }
}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = false
    if let touch = touches.first  {
        lastPoint = touch.location(in: self.view)
    }
}

@IBAction func colorsPicked(_ sender: AnyObject) {
    if sender.tag == 0 {
        (red,green,blue) = (0,0,0)
    } else if sender.tag == 1 {
        (red,green,blue) = (0.25,0.00,0.39)
    } else if sender.tag == 2 {
        (red,green,blue) = (0.65,0.62,0.75)
    } else if sender.tag == 3 {
        (red,green,blue) = (1.00,0.00,0.00)
    } else if sender.tag == 4 {
        (red,green,blue) = (0.49,0.77,0.46)
    } else if sender.tag == 5 {
        (red,green,blue) = (0.0,0.68,0.94)
    } else if sender.tag == 6 {
        (red,green,blue) = (0.96,0.56,0.34)
    } else if sender.tag == 7 {
        (red,green,blue) = (1.00,0.95,0.00)
    }
}



@IBAction func reset(_ sender: AnyObject) {
    self.imageView.image = nil
}


func drawLines(fromPoint:CGPoint,toPoint:CGPoint) {

    UIGraphicsBeginImageContext(self.view.frame.size)
    imageView.image?.draw(in: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
    let context = UIGraphicsGetCurrentContext()

    context?.move(to:CGPoint(x: fromPoint.x, y: fromPoint.y))
    context?.addLine(to: CGPoint(x: toPoint.x, y: toPoint.y))

    context?.setBlendMode(CGBlendMode.normal)
    context?.setLineCap(CGLineCap.round)
    context?.setLineWidth(lw)
    context?.setStrokeColor(UIColor(red: red, green: green, blue: blue, alpha: alpha).cgColor)

    context?.strokePath()

    imageView.image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = true
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        drawLines(fromPoint: lastPoint, toPoint: currentPoint)

        lastPoint = currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if !swiped {
        drawLines(fromPoint: lastPoint, toPoint: lastPoint)
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


}

0 个答案:

没有答案