Как сделать снимок из UIImage UIImageView, который находится в режиме scaleAspectFit? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть изображение в UIImageView:

imageView.contentMode = .scaleAspectFit        
imageView.backgroundColor = .red

из-за .scaleAspectFit вид изображения имеет некоторые красные границы, и это нормально:

imageView with .scaleAspectFit image

Пользователь может добавить UIView метку или изображения поверх imageView. На последнем шаге я использовал следующий код для сохранения отредактированного изображения, и пользователь может поделиться им или сохранить его в библиотеке фотографий:

private func generateImage() -> UIImage? {
    var finalImage: UIImage?
    UIGraphicsBeginImageContextWithOptions(CGSize(width: imageView.frame.size.width, height: imageView.frame.size.height), true, 0)
    imageView.drawHierarchy(in: CGRect(x: 0, y: 0, width: imageView.frame.size.width, height: imageView.frame.size.height), afterScreenUpdates: true)
    finalImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

Проблема в том, что finalImage все еще имеет красные границы от imageView.

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете получить CGRect из UIImage, отображаемого в режиме UIImageView в AspectFit. Пожалуйста, создайте расширение UIImageView, как это,

extension UIImageView {
    var contentClippingRect: CGRect {
        guard let image = image else { return bounds }
        guard contentMode == .scaleAspectFit else { return bounds }
        guard image.size.width > 0 && image.size.height > 0 else { return bounds }

        let scale: CGFloat
        if image.size.width > image.size.height {
            scale = bounds.width / image.size.width
        } else {
            scale = bounds.height / image.size.height
        }

        let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
        let x = (bounds.width - size.width) / 2.0
        let y = (bounds.height - size.height) / 2.0

        return CGRect(x: x, y: y, width: size.width, height: size.height)
    }
}

Теперь вы можете использовать imageView.contentClippingRect, чтобы прочитать, как читать положение и размер изображения внутри.

Вы должны внести незначительные изменения в свой метод, вызвать вашу функцию с соответствующими границами как contentClippingRect.

Сообщите мне, если возникнут какие-либо вопросы.

UPDATE

Пожалуйста, попробуйте это UIImageView + расширение , это может помочь вам. Это в коде Objective-C, конвертируйте его в Swift.

Вы также можете попробовать это,

    let image  = #imageLiteral(resourceName: "Cat03")
    let x: CGRect = AVMakeRect(aspectRatio: image.size, insideRect: imageView1.frame)
    print(x)

Выше код дает вам размер идеально.

...