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