Я делаю приложение, которое имеет 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!)
}