Swift ImageCropper возвращает изображение за пределы указанного «окна» - PullRequest
0 голосов
/ 27 апреля 2018

Я делаю приложение, которое имеет UIWebView вместе с кнопкой на одном контроллере представления. Когда кнопка нажата, изображение (из UIWebView) захватывается с использованием UIGraphicsContext.

Эта часть прекрасно работает! Но когда кнопка нажата, после захвата изображения она отображает изображение как подпредставление в том же виде, и я пытался использовать библиотеку ImageCropper, которая рисует CGRect в другом подпредставлении поверх UIImageView на экране с отправкой кнопка. Размер самого прямоугольника можно изменять (перетаскивая углы / края) и перемещать по виду.

Когда нажата кнопка отправки, в левой верхней части экрана отображается другое подпредставление, в котором отображается обрезанное изображение (после нажатия кнопки отправки). Идея состоит в том, чтобы захватить только то, что находится внутри прямоугольника. Я могу заставить работать код, но захваченное изображение имеет то же изображение, но не раздел, который находится внутри CGRect.

У меня есть 3 изображения, которые показывают, как это работает, и изображение, которое неправильно обрезано. Введите описание изображения здесь. Снимок 1 . Снимок 2 Снимок 3 . Я считаю, что мои проблемы заключаются в размере захваченного изображения, а размер изображения с прямоугольником кадрирования не равен, и поэтому он искажает его.

Кто-нибудь знает, в чем может быть причина? Извините за длинный вопрос, но любая помощь будет принята с благодарностью!

Вот мой код ниже:

ViewController.swift:

class ViewController: UIViewController {

    @IBOutlet var webView: UIWebView!

    @IBOutlet var imageView: UIImageView!


    override func viewDidLoad() {
    imageView.isHidden = true
    let aString = URL(string: "https://www.kshuntfishcamp.com/home.page")
    webView.loadRequest(URLRequest(url: aString!))
    super.viewDidLoad()

    }

    @IBAction func takePhotoPressed(_ sender: UIButton) {
    UIGraphicsBeginImageContextWithOptions(webView.bounds.size, false, 0.0)
    if let aContext = UIGraphicsGetCurrentContext(){
        webView.layer.render(in: aContext)
    }

    let capturedImage:UIImage? = UIGraphicsGetImageFromCurrentImageContext()

    imageView = UIImageView(frame: CGRect(x: 22, y: 123, width: 330, height: 330))
    let image = capturedImage
    imageView.image = image
    imageView.contentMode = UIViewContentMode.scaleAspectFill
    imageView.clipsToBounds = true
    imageView.isHidden = true
    webView.isHidden = true

    let editView = EditImageView(frame: self.view.frame)
    let image2 = capturedImage!
    editView.initWithImage(image: image2)

    let croppedImage = editView.getCroppedImage()

    self.view.addSubview(editView)
    self.view.backgroundColor = UIColor.clear

    UIImageWriteToSavedPhotosAlbum(croppedImage, nil, nil, nil)
}

EditImageView.swift - источник (https://github.com/Thanatos-L/LyEditImageView)-only, включая детали, которые кажутся важными для решения проблемы

func initWithImage(image:UIImage){
    imageView = UIImageView(frame: CGRect(x: 22, y: 123, width: 330, height: 330))
    imageView.tag = IMAGE_VIEW_TAG;
    self.addSubview(self.imageView)
    imageView.isUserInteractionEnabled = true;
    imageView.image = image
    imageView.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    let frame = AVMakeRect(aspectRatio: imageView.frame.size, insideRect: self.frame);
    imageView.frame = frame
    originImageViewFrame = frame
    NSLog("initWithImage %@", NSStringFromCGRect(originImageViewFrame))
    imageZoomScale = 1.0
    commitInit()
}

private func cropImage() {
    let rect = self.convert(cropView.frame, to: imageView)
    let imageSize = imageView.image?.size
    let ratio = originImageViewFrame.size.width / (imageSize?.width)!
    let zoomedRect = CGRect(x: rect.origin.x / ratio, y: rect.origin.y / ratio, width: rect.size.width / ratio, height: rect.size.height / ratio)
    let croppedImage = cropImage(image: imageView.image!, toRect: zoomedRect)

    var view: UIImageView? =  self.viewWithTag(1301) as? UIImageView
    if view == nil {
        view = UIImageView()
    }
    view?.frame = CGRect(x: 0, y: 0, width: croppedImage.size.width , height: croppedImage.size.height)
    view?.image = croppedImage
    view?.tag = 1301
    self.addSubview(view!)
    }
...