как получить прямоугольник изображения, чтобы обрезать его - PullRequest
0 голосов
/ 24 февраля 2020

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

 func cropImage(_ inputImage: UIImage, toRect cropRect: CGRect, viewWidth: CGFloat, viewHeight: CGFloat) -> UIImage? 
{    
let imageViewScale = max(inputImage.size.width / viewWidth,
                             inputImage.size.height / viewHeight)

    // Scale cropRect to handle images larger than shown-on-screen size
    let cropZone = CGRect(x:cropRect.origin.x * imageViewScale,
                          y:cropRect.origin.y * imageViewScale,
                          width:cropRect.size.width * imageViewScale,
                          height:cropRect.size.height * imageViewScale)

    // Perform cropping in Core Graphics
    guard let cutImageRef: CGImage = inputImage.cgImage?.cropping(to:cropZone)
    else {
        return nil
    }

    // Return image to UIImage
    let croppedImage: UIImage = UIImage(cgImage: cutImageRef)
    return croppedImage
}

, чтобы обрезать изображение, мне нужно cropRect. В Inte rnet я также нашел решение, которое реализовал в своем коде:

func realImageRect() -> CGRect {
    let imageViewSize = self.frame.size
    let imgSize = self.image?.size

    guard let imageSize = imgSize else {
        return CGRect.zero
    }

    let scaleWidth = imageViewSize.width / imageSize.width
    let scaleHeight = imageViewSize.height / imageSize.height
    let aspect = fmin(scaleWidth, scaleHeight)

    var imageRect = CGRect(x: 0, y: 0, width: imageSize.width * aspect, height: imageSize.height * aspect)


    // Center image
    imageRect.origin.x = (imageViewSize.width - imageRect.size.width) / 2
    imageRect.origin.y = (imageViewSize.height - imageRect.size.height) / 2

    // Add imageView offset
    imageRect.origin.x += self.frame.origin.x
    imageRect.origin.y += self.frame.origin.y

    return imageRect
}

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

   for i in 0..<imageContentView.count {
        let cropRect = CGRect(x: croppedViewArray[i].frame.origin.x - imageContentView[i].realImageRect().origin.x, y: croppedViewArray[i].frame.origin.y - imageContentView[i].realImageRect().origin.y, width: croppedViewArray[i].frame.width, height: croppedViewArray[i].frame.height)

        print("cropRect", cropRect)
        let croppedImage = ImageCrophandler.sharedInstance.cropImage(imageContentView[i].image!, toRect: cropRect, viewWidth: imageContentView[i].frame.width, viewHeight: imageContentView[i].frame.height)


        print("cheight", croppedImage!.size.height,"cwidth", croppedImage!.size.width)
        arrayOfCropedImages.append(croppedImage!)

    }

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

...