2016-09-08 2 views
0

Я работаю над созданием контроллера вида, который обрезает изображение до определенного размера с помощью перетаскиваемых контрольных точек, а фоновое изображение за пределами зоны обрезки будет затемнено.Изображение Обрезка захвата неправильной части UIImage во время обрезки

По какой-либо причине, когда изображение обрезается, оно захватывает неправильную ссылку. Я рассматривал почти все другие сообщения об этом, чтобы иметь дело с обрезкой.

Вот моя установка для раскадровки: enter image description here

Я задал несколько других людей, в том числе воспитателя и наставника из курса, который я принимаю, но все мы, кажется, тупик.

я могу выбрать кадр, перетаскивая углы UL UR DL DR вокруг контроллера представления, как это:

Notice the files selected from the right of the screen.

Но когда я нажимаю на кнопку и использовать функцию кадрирования, которую я написал, я получить то, что не является правильным урожаем, основанным на выборке в рамке.

enter image description here

Я также получаю сообщение об ошибке во время вегетационного proceedure:

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() 
    } 
+0

Вам действительно нужно показать _all_ этот код, чтобы задать этот вопрос? Я не могу понять, где искать. И что означает «это захват неправильной ссылки» даже _mean_? Я не могу понять, в чем вопрос. – matt

+0

Привет, Мэтт, извините, если это немного подробный. Я просто хотел убедиться, что контекст был ясен. Я использую несколько представлений, чтобы манипулировать другими, а затем в конечном итоге пытаюсь захватить часть изображения, основанную на границах маскирующего представления, которое было изменено этими представлениями. –

+0

Я предлагаю вам сделать MCVE (минимальный полный проверяемый пример). Покажите мне, как иметь проблему, с которой вы сталкиваетесь, ни с чем другим. – matt

ответ

2

Я знаю, это было давно ... Просто мысли, я столкнулся с аналогичной проблемой, и я обнаружил, что фреймы для обрезки, скорее всего, правильны. Проблема заключается в фактическом размере изображения, которое вы пытаетесь обрезать. Я решил проблему, установив размеры моего представления, которое содержит изображение, с фактическим размером изображения (в точках). Затем область обрезки обрезала то, что было выбрано. Я знаю, что это, вероятно, не решение, просто обмен опытом, надеюсь, что это поможет включить некоторые лампочки :)

Смежные вопросы