cgImage.cropping (to: CGRect) возвращает уменьшенное и смещенное изображение, чем ожидалось - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь реализовать приложение ios AR.Что я хочу сделать: если пользователь касается экрана, происходит скриншот, но я хочу только сохранить изображение внутри квадрата и отобразить его в верхнем левом углу.Поэтому мне нужно обрезать скриншот.Кажется, я передаю неправильный размер и положение квадрата?Что я делаю неправильно?Использую ли я неправильную единицу для координат и размеров или мне что-то не так с масштабированием?!

В этом классе я получаю размер и положение квадрата в зависимости от текущего устройства

class ViewController: UIViewController, ARSKViewDelegate, UIPickerViewDataSource, UIPickerViewDelegate, SceneDelegate {

    var squareRect: CGRect = CGRect(x: 0, y: 0, width: 0, height: 0)

    @IBOutlet var sceneView: ARSKView!

    //that's the square
    @IBOutlet weak var squareImage: UIImageView!

    //this is where the cropped image should be displayed
    @IBOutlet weak var imageView: UIImageView!

    ...

    func getRect() -> CGRect{
        return squareRect
    }

    ...

    @objc func rotated(){

        if UIDevice.current.orientation.isLandscape {
            squareImage.frame.size.height = sceneView.frame.size.height * 0.77
            squareImage.frame.size.width = squareImage.frame.size.height
        }
        else {
            squareImage.frame.size.width = sceneView.frame.size.width * 0.77
            squareImage.frame.size.height = squareImage.frame.size.width
        }

        squareImage.center = sceneView.center

        squareRect = CGRect(origin: squareImage.frame.origin, size: squareImage.frame.size)
    }

В этом классе касание будет обрабатываться, и должно отображаться обрезанное изображение:

protocol SceneDelegate{
    func getRect() -> CGRect
}

class Scene: SKScene {

    var sceneDelegate: SceneDelegate?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        guard let sceneView = self. view as? ARSKView else{ return }

        guard let imageView = sceneView.subviews.first as? UIImageView else { return }

        if let image = UIImage(pixelBuffer: currentFrame.capturedImage) {
            let cgImage: CGImage = CGImage(image)
            let croppedCGImage = cgImage.cropping(to: self.sceneDelegate!.getRect())
            let croppedImage = UIImage(cgImage: croppedCGImage!, scale: self.scale, orientation: up) 
            DispatchQueue.main.async {
                imageView.image = croppedImage
                    }

Примечание: основа кода была создана Джорданом Остербергом 14/17/17 (Copyright 2017Shadow Technical Systems)

Итак вот это (нажмите для просмотра изображения) , что делает мой код: он обрезает очень маленькую картинку, расположенную в правом верхнем углу?

РЕДАКТИРОВАТЬ:

Вы едва можете увидеть квадрат на изображении, поэтому я загрузил другое изображение .Стрелки указывают на края квадрата.

И, очевидно, я передаю неправильный размер и положение квадрата!Но почему?

Я заменил размер и ширину squareRect на:

let heightInPixel = squareImage.frame.height * UIScreen.main.scale
let widthInPixel = squareImage.frame.width* UIScreen.main.scale

На самом деле изображение теперь увеличилось, но оно все еще слишком маленькое.И как мне преобразовать x и y позицию?

...