无法使用 CGImageCreateWithImageInRect 快速裁剪触摸位置

Posted

技术标签:

【中文标题】无法使用 CGImageCreateWithImageInRect 快速裁剪触摸位置【英文标题】:Cannot crop touched location with CGImageCreateWithImageInRect in swift 【发布时间】:2016-04-01 22:40:08 【问题描述】:

我正在尝试在触摸位置复制背景图像的一部分,然后在与裁剪部分相同的位置添加一个子视图。如果我做的正确,两个图像都会排列,你不能告诉两个 UIImageViews 在那里,但它最终看起来像下面的图片。为什么这个不排队,为什么新图放大了一点?

更新:我的 ImageView 与主视图大小相同,并且图像模式是宽高比,因此图像上方和下方的白色仍然是图像视图的一部分。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
    let touch = touches.first!.locationInView(view)
    let rect = CGRect(origin: touch, size: CGSize(width: 90, height: 90))

    let imageRef = CGImageCreateWithImageInRect(mainImageView.image!.CGImage, rect)

    if imageRef != nil 
        let newImage = UIImage(CGImage: imageRef!)

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

触摸前:

接触后:

【问题讨论】:

你可以使用 UIImageView-GeometryConversion 类来获得正确的接触点..这里是链接github.com/nubbel/UIImageView-GeometryConversion 感谢您的回复。你知道我在哪里可以找到 swift 中的示例,因为我仍然不太确定我做错了什么? 我试过了: let convertPoint = self.mainImageView.convertPoint(touch, toView: self.mainImageView) let rect = CGRect(origin: convertPoint, size: CGSize(width: 90, height: 90)) 【参考方案1】:

我终于明白了:

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

    let touch = touches.first!.locationInView(view)

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

    let crop = CGRectMake(touch.x - 45, touch.y - 45, 90, 90)
    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: newImage)
                bgImage.center = touch
                self.view.addSubview(bgImage)
                self.view.bringSubviewToFront(bgImage)
            
        
    


【讨论】:

以上是关于无法使用 CGImageCreateWithImageInRect 快速裁剪触摸位置的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

LINUX下的mail\mailx为啥无法使用外部SMTP发邮件