SwiftUI - масштабирование, масштабирование и обрезка изображения - PullRequest
1 голос
/ 23 января 2020

Отредактировано с ссылкой на репозиторий .

Я использую SwiftUI и поэтому не имею доступа к «представлению обрезки». Я использую жесты вместо ScrollView для захвата уровня масштабирования и смещения (x и y) изображения. Я не могу вернуть изображение, которое обрезается должным образом на основе этих факторов.

Кажется, что сам SwiftUI может быть фактором. Возможно, необходимо учитывать смещение изображения в представлении при определении смещений и уровней масштабирования?

У меня есть изображение, и у меня есть следующие значения из жестов на представлении для представления масштаба и x / y position:

 @State var scale: CGFloat = 1.0
 @State var currentPosition: CGSize = CGSize.zero

Текущая попытка, которая ближе всего подходит к вызываемой функции:

func prepareImage( ) {

        let imageToManipulate =  UIImage(named: "landscape")
        let currentPositionWidth = self.currentPosition.width
        let currentPositionHeight = self.currentPosition.height
        let zoomScale = self.scale
        let imsize = imageToManipulate!.size

        var scale : CGFloat = self.frameSize.width / imsize.width
        if imsize.height * scale < self.frameSize.height {
            scale = self.frameSize.height / imsize.height
        }
        let croppedImsize = CGSize(width: (self.frameSize.width/scale) / zoomScale, height: (self.frameSize.height/scale) / zoomScale)
        let xOffset = (( imsize.width - croppedImsize.width ) / 2.0) - (currentPositionWidth / zoomScale)
        let yOffset = (( imsize.height - croppedImsize.height) / 2.0) - (currentPositionHeight / zoomScale)
        let croppedImrect: CGRect = CGRect(x: xOffset, y: yOffset, width: croppedImsize.width, height: croppedImsize.height)

        let r = UIGraphicsImageRenderer(size:croppedImsize)
        let croppedIm = r.image { _ in
            imageToManipulate!.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
        }
        self.croppedImage = croppedIm
        self.photoIsFinished = true
    }

Однако, как вы увидите в репозитории, при объединении обоих zoom / масштаб и смещение по оси x / y всегда немного «выключены».

Кроме того, когда вы пытаетесь обрезать квадратное изображение, его значение может быть весьма значительным.

1 Ответ

0 голосов
/ 25 января 2020

Ответ был предоставлен через репозиторий GitHub: juanj

let imageToManipulate =  UIImage(named: "landscape")
let zoomScale = self.scale
let imsize = imageToManipulate!.size

var scale : CGFloat = self.frameSize.width / imsize.width
if imsize.height * scale < self.frameSize.height {
 scale = self.frameSize.height / imsize.height
}
let currentPositionWidth = self.currentPosition.width / scale
let currentPositionHeight = self.currentPosition.height / scale
let croppedImsize = CGSize(width: (self.frameSize.width/scale) / zoomScale, height: (self.frameSize.height/scale) / zoomScale)
let xOffset = (( imsize.width - croppedImsize.width ) / 2.0) - (currentPositionWidth / zoomScale)
let yOffset = (( imsize.height - croppedImsize.height) / 2.0) - (currentPositionHeight / zoomScale)
let croppedImrect: CGRect = CGRect(x: xOffset, y: yOffset, width: croppedImsize.width, height: croppedImsize.height)

let r = UIGraphicsImageRenderer(size:croppedImsize)
let croppedIm = r.image { _ in
            imageToManipulate!.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
        }
self.croppedImage = croppedIm
self.photoIsFinished = true

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...