仅擦除图像的一部分(当前整个图像被擦除)

时间:2015-09-15 00:50:25

标签: ios swift

我正在尝试使用手指点击或拖动来擦除UIImageView的一部分。

这是我到目前为止所拥有的:

let panErase = UIPanGestureRecognizer(target: self, action: "erase:")
let tapErase = UITapGestureRecognizer(target: self, action: "erase:")
imageBeingEdited.addGestureRecognizer(panErase)
imageBeingEdited.addGestureRecognizer(tapErase)

我不太确定如何调试图形上下文修改,但这会擦除整个图像:

    let erasurePoint: CGPoint = gesture.locationInView(imageBeingEdited)
    println("\(erasurePoint.x) \(erasurePoint.y)")

    let image:UIImage = imageBeingEdited.image!
    let s = image.size
    UIGraphicsBeginImageContext(s)
    let g = UIGraphicsGetCurrentContext()
    CGContextBeginPath(g);
    CGContextAddEllipseInRect(g, CGRectMake(erasurePoint.x, erasurePoint.y, 5, 5))
    CGContextEOClip(g)
    image.drawAtPoint(CGPointZero)
    imageBeingEdited.image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

目标是在点击位置删除一个圆圈。我在这里想念的是什么?看起来图像被裁剪成5x5圆圈,而不一定是在分接点处。

1 个答案:

答案 0 :(得分:1)

在我看来,您发布的代码会导致将图像剪裁为5x5椭圆,正如您所描述的那样。

您是编写此代码还是从其他地方复制代码?

需要重新排列,因此它首先将图像绘制到上下文中,然后使用清晰的颜色和绘制模式绘制椭圆,其中源像素的alpha被写入目标。不要乱用上下文的剪切路径。

这对我来说看起来不是非常有效的代码。在平移手势的每次更改中,您都要创建上下文,将图像绘制到其中,然后复制出新图像。然后,据推测,您正在绘制结果图像。这可能不够快,无法跟上用户的平移手势。

相反,我可能会将CAShapeLayer作为遮罩层添加到我的图像视图的图层,并修改该遮罩图层的路径,为用户触摸的每个点的遮罩路径添加一个椭圆。即使这可能还不够快,无法顺利绘制。您可能需要编写在开始和结束触摸位置之间插值并填充整个段的代码。