Я пытаюсь реализовать приложение 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 позицию?