【问题标题】:Image Cropping grabbing the wrong portion of UIImage during crop图像裁剪在裁剪期间抓取 UIImage 的错误部分
【发布时间】:2017-01-15 20:04:55
【问题描述】:

我一直致力于制作一个视图控制器,它将图像裁剪为特定大小,并带有一些可拖动的控制点,并且裁剪区域之外的背景图像变暗。

由于某种原因,只要图像被裁剪,它就会抓取错误的参考。我已经看过几乎所有其他关于裁剪的帖子。

这是我的故事板设置:

我问过其他几个人,包括我正在学习的课程的导师和导师,但我们似乎都被难住了。

我可以通过拖动视图控制器周围的 UL UR DL DR 角来选择一个框架,如下所示:

但是当我按下按钮并使用我编写的裁剪功能时,我得到的东西不是基于框架选择的正确裁剪。

在裁剪过程中我也收到此错误消息:

 2016-09-07 23:36:38.962 ImageCropView[33133:1056024] 
  <UIView: 0x7f9cfa42c730; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7f9cfa408400>>'s window
  is not equal to <ImageCropView.CroppedImageViewController: 0x7f9cfa43f9b0>'s view's window!

代码中有问题的部分必须位于以下函数之一中。

这里是裁剪功能:

 func cropImage(image: UIImage, toRect rect: CGRect) -> UIImage {


        func rad(deg: CGFloat) -> CGFloat {
            return deg / 180.0 * CGFloat(M_PI)
        }
        // determine the orientation of the image and apply a transformation to the crop rectangle to shift it to the correct position
        var rectTransform: CGAffineTransform
        switch image.imageOrientation {
        case .Left:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -image.size.height)
        case .Right:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -image.size.width, 0)
        case .Down:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -image.size.width, -image.size.height)
        default:
            rectTransform = CGAffineTransformIdentity
        }




        // adjust the transformation scale based on the image scale
        rectTransform = CGAffineTransformScale(rectTransform, UIScreen.mainScreen().scale, UIScreen.mainScreen().scale)
        // apply the transformation to the rect to create a new, shifted rect
        let transformedCropSquare = CGRectApplyAffineTransform(rect, rectTransform)
        // use the rect to crop the image
        let imageRef = CGImageCreateWithImageInRect(image.CGImage, transformedCropSquare)
        // create a new UIImage and set the scale and orientation appropriately
        let result = UIImage(CGImage: imageRef!, scale: image.scale, orientation: image.imageOrientation)

        return result
    }

这里是设置和翻译遮罩视图的函数

    func setTopMask(){
        let path = CGPathCreateWithRect(cropViewMask.frame, nil)
        topMaskLayer.path = path
        topImageView.layer.mask = topMaskLayer

    }

    func translateMask(sender: UIPanGestureRecognizer) {
        let translation = sender.translationInView(self.view)
        sender.view!.center = CGPointMake(sender.view!.center.x + translation.x, sender.view!.center.y + translation.y)
        //        print(sender.translationInView(self.view))
        sender.setTranslation(CGPointZero, inView: self.view)
        //        print("panned mask")

        if sender.state == .Ended {
            printFrames()
        }

    }


  func setCropMaskFrame() {
        let x = ulCorner.center.x
        let y = ulCorner.center.y
        let width = urCorner.center.x - ulCorner.center.x
        let height = blCorner.center.y - ulCorner.center.y

        cropViewMask.frame = CGRectMake(x, y, width, height)
        setTopMask()
    }

【问题讨论】:

  • 您真的需要显示所有代码才能提出这个问题吗?我不知道在哪里看。 “它抓取了错误的引用”甚至意味着是什么意思?我不知道问题是什么。
  • 嗨,马特,如果有点冗长,对不起。我只是想确保上下文清楚。我正在使用几个视图来操作其他视图,然后最终尝试根据由这些视图调整大小的掩蔽视图的边界来抓取图像视图的一部分。
  • 我建议你制作一个 MCVE(最小的完整可验证示例)。告诉我如何解决您遇到的问题,别无其他。
  • 马特,我已经更新了我的问题以缩小要查看的区域,并提供了一些正在发生的事情的屏幕截图。谢谢!
  • “代码中的违规部分必须位于以下函数之一中。”也许,但也许不是。让我们专注于错误消息。您是否在代码中的某个位置创建了一个新窗口?

标签: swift core-graphics crop


【解决方案1】:

我知道这是很久以前的事了...只是一个想法,我遇到了类似的问题,我发现裁剪的帧很可能是正确的。问题在于您尝试裁剪的图片的实际大小。我通过将包含图片的视图大小与实际图片大小(以磅为单位)对齐来解决了这个问题。然后裁剪区域裁剪所选内容。我知道这可能不是一个解决方案,只是分享我的经验,希望它有助于打开一些灯泡:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2010-09-14
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多