我在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)
}
}
}
}
这是一个工作的例子:
这是一个扭曲图像的例子,因为我碰到了边缘附近:
答案 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定位到原始图像中的相同位置。