Получите изображение предварительного просмотра из файла dae, чтобы отобразить в UIImage - PullRequest
1 голос
/ 03 июня 2019

Я создаю приложение с дополненной реальностью и хотел бы показать предварительные изображения доступных файлов DAE.

Можно ли использовать Swift для извлечения данных изображения из файла DAE и загрузки их в UIImage?

1 Ответ

0 голосов
/ 08 июня 2019

Из коробки нет функции для вызова, которая будет извлекать снимок экрана из файла .dae. Это не значит, что на устройстве нет способа сделать это.

Чтобы понять, что вы спрашиваете, давайте рассмотрим различные компоненты.

Файл .dae загружается с использованием ARSCNView, который предназначен для чтения файлов .dae. ARSCNView традиционно добавляется как подпредставление к вашему ViewController. В этом случае вам понадобится программа просмотра для визуализации 3D-файла вне экрана, поэтому вам нужно создать ARSCNView, но не добавлять его в качестве подпредставления VC (я бы добавил его во время начальной настройки, чтобы убедиться, что все загружается , но затем закомментируйте эту строку)

После того, как вы загрузили 3D в ARSCNView, используйте функцию ниже, чтобы скопировать контекст вида в изображение JPG

let viewSnapshot = takeSnapshotOfView(view: yourARSCNView)

и разорвать контекст и изменить размер JPG:

import UIKit
import CoreGraphics


func takeSnapshotOfView(view:UIView) -> UIImage? {
    UIGraphicsBeginImageContext(CGSize(width: view.frame.size.width, height: view.frame.size.height))
    view.drawHierarchy(in: CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height), afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image?.resize(CGRect(x: 0, y: 0, width: 300, height: (image?.size.height)! / 300 * (image?.size.width)!)) // resize image before returning
}


extension UIImage {
    func resize(_ toSize: CGRect) -> UIImage {
        let size = self.size

        let widthRatio = toSize.width / self.size.width
        let heightRatio = toSize.height / self.size.height

        var newSize: CGSize
        if widthRatio > heightRatio {
            newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
        } else {
            newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
        }

        let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
        self.draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }
}
...