CGImageCreateWithImageInRect切断

时间:2016-04-18 23:10:44

标签: ios swift uiimageview cgimage

我在Swift中使用CGImageCreateWithImageInRect在触摸位置创建部分图像的副本。

我的代码效果很好,除非用户触摸屏幕边缘并且矩形尺寸落在视图框外。它不是返回一个正方形,而是从切断视图外部的数量返回一个矩形(我假设)。形状的变化会抛弃复制图像的位置,因此它不会与下部图像对齐。

如何保持方形/大小并忽略边界,以便我的图像对齐?

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let touch = touches.first!.locationInView(mainImageView?.superview)

    UIGraphicsBeginImageContext(self.view.bounds.size)
    UIApplication.sharedApplication().keyWindow!.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    let crop = CGRectMake(touch.x - CGFloat(brushWidth) / 2, touch.y - CGFloat(brushWidth) / 2, CGFloat(brushWidth), CGFloat(brushWidth))

    let imageRef = CGImageCreateWithImageInRect(screenshot.CGImage, crop)

    if imageRef != nil {
        let newImage: UIImage = UIImage(CGImage: imageRef!, scale: mainImageView.image!.scale, orientation: mainImageView.image!.imageOrientation)

                let bgImage = UIImageView(image: processedImage)
                bgImage.center = touch
                self.view.addSubview(bgImage)

            }
        }
    }

}

这是一个工作的例子:

enter image description here

这是一个扭曲图像的例子,因为我碰到了边缘附近:

enter image description here

1 个答案:

答案 0 :(得分:3)

CGImageCreateWithImageInRect(screenshot.CGImage,crop)确实返回了裁剪版本。以下是文档中的相关评论:

  

Quartz执行这些任务来创建子图像:

     
      
  • 通过调用函数CGRectIntegral将rect参数指定的区域调整为整数边界。

  •   
  • 将结果与原点为(0,0)且尺寸等于图像参数指定的图像大小的矩形相交。

  •   
  • 引用生成的矩形内的像素,将矩形内的第一个像素视为子图像的原点。

  •   

解决此问题的一种简单方法是调整生成的UIImageView的位置,使其大小正确。以下是相关计算:

let screenshotBounds = CGRectMake(0.0, 0.0, screenshot.size.width, screenshot.size.height)
let cropIntegral = CGRectIntegral(crop)
let cropIntersection = CGRectIntersection(cropIntegral, screenshotBounds)
bgImage.center = CGPoint(CGRectGetMidX(cropIntersection), CGRectGetMidY(cropIntersection))

cropIntersection是我们提取的图像的边界矩形(遵循文档中给出的前两个步骤)。因此,我们可以使用它将imageView定位到原始图像中的相同位置。