【问题标题】:Trying to make erase uiimage with swift试图用swift擦除uiimage
【发布时间】:2019-09-12 09:42:12
【问题描述】:

我正在尝试为我的应用制作橡皮擦功能(并在将来恢复),但遇到了一些问题。我正在使用 Swift 4.2,这是我目前所做的:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first as UITouch?{
            let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
            print("touch begin to : \(touchPoint)")
            eraserStartPoint = touchPoint   
        }
    }
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first as UITouch?{
            let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
            print("touch moved to : \(touchPoint)")
            erase(fromPoint: eraserStartPoint!, toPoint: touchPoint)
            eraserStartPoint = touchPoint
        }
    }
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first as UITouch?{
            let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
            print("touch ended at : \(touchPoint)")
            erase(fromPoint: touchPoint, toPoint: touchPoint)
            UIGraphicsBeginImageContext(lassoImageView.frame.size)
                lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
                lassoImageView.image?.draw(in:  CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
                lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()   
    }
func erase(fromPoint: CGPoint, toPoint: CGPoint) {
        UIGraphicsBeginImageContextWithOptions(lassoImageView.bounds.size, false, 1)
        //UIGraphicsBeginImageContext(lassoImageView.bounds.size)
        //UIGraphicsBeginImageContext(lassoImageView.image!.size)
        let context = UIGraphicsGetCurrentContext()
        lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height))
        //lassoImageView.image?.draw(in: calculateRectOfImageInImageView(imageView: lassoImageView))

        context?.move(to: fromPoint)
        context?.addLine(to: toPoint)

        context?.setLineCap(.round)
        context?.setLineWidth(CGFloat(eraserBrushWidth))

        context?.setBlendMode(.clear)

        context?.strokePath()

        lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
        croppedImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()
    }
lassoImageView // this is UIImageView where I'm loading image from gallery and then erasing image with my finger

lassoOffset // this is Float for touch offset because finger hides part of image

代码很简单,它确实有效,但如果图像纵横比与 UIImageView 纵横比不同。 UIImageView 内容模式设置为Aspect Fit,但无论如何,当我拖动手指图像时,它会像Scale to Fill 一样被拉伸

我认为问题出在我的这一行中:

lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height))

我什至尝试计算图像 rect 本身,但在这种情况下,图像在 touches begun 之后消失了

也许我的问题是菜鸟,我可能错过了一些荒谬的东西,但我真的需要弄清楚这一点。

感谢每一个人,祝你有美好的一天

最好的,维克多

【问题讨论】:

    标签: swift uiimage crop erase uigraphicscontext


    【解决方案1】:

    天哪……

    我刚做了这个

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let touch = touches.first as UITouch?{
                let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
                print("touch ended at : \(touchPoint)")
                erase(fromPoint: touchPoint, toPoint: touchPoint)
                /*UIGraphicsBeginImageContext(lassoImageView.frame.size)
                    lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
                    lassoImageView.image?.draw(in:  CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
                    lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()   */
        }
    

    在我的erase 方法中更改了这行:

    lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height))
    

    到这个:

    lassoImageView.layer.render(in: context!)
    

    不确定这里发生了什么,但现在效果很好

    【讨论】:

    • 你好,你实现了“恢复”功能吗?
    猜你喜欢
    • 2021-08-14
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2011-05-30
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多