【问题标题】:CGImageCreateWithImageInRect cutting offCGImageCreateWithImageInRect 切断
【发布时间】:2016-04-18 23:10:43
【问题描述】:

我在 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)

            }
        }
    }

}

这是一个工作示例:

这是一个扭曲图像的示例,因为我触摸了边缘:

【问题讨论】:

  • 能否简单检查触摸是否发生在图像之外,如果发生则忽略它?
  • 这是一个聪明的主意。我想了想,但从技术上讲,触摸是在图像内部。矩形的一部分刚刚落在外面,如果用户在边缘附近触摸,我仍然希望用户能够进行裁剪。
  • 有道理。你知道为什么第二张图片中的黄色矩形包含移位的图像数据吗?如果您将矩形向左移动,您可以看到它和原始图像对齐。
  • 不知道。我正在拔头发。我的猜测是,如果矩形悬挂在设备的框架上并且形状的变化会使其不对齐,那么矩形的大小会减小。
  • 这是另一个猜测:如果你触摸熊猫照片的外部,那么对齐是相对于外部视图控制器而不是熊猫视图控制器完成的。由于外部视图控制器稍宽,因此矩形向外。如果你让你的熊猫视图控制器更窄会发生什么?

标签: ios swift uiimageview cgimage


【解决方案1】:

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

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

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

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

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

解决此问题的一种简单方法是调整生成的 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定位到原始图像中的相同位置。

【讨论】:

  • 完美运行!感谢您也整合我的变量!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多