如何使用 Swiftui 在函数中将快照图像作为字节数组返回?

问题描述 投票:0回答:1

我有以下函数,它采用三个参数来使用 MKMapSnapshotter 生成快照图像。该函数正确生成快照,但我想将生成的快照作为字节数组返回。我认为它可以通过使用回调、完成处理程序或类似的东西来执行,如果有任何答案,我将不胜感激。

func generateImageSnapshot(location:CLLocationCoordinate2D, width: CGFloat, height:   CGFloat) {
let options = MKMapSnapshotter.Options()
options.camera = MKMapCamera(lookingAtCenter: location, fromDistance: 300, pitch: 0, heading: 0)
options.mapType = .standard
options.size = CGSize(width: width, height: height)
let snapshotter = MKMapSnapshotter(options: options)
snapshotter.start() { snapshot, _ in
let mapImage = snapshot?.image
let finalImage = UIGraphicsImageRenderer(size: options.size).image { _ in
mapImage?.draw(at: .zero)
let pinView = MKPinAnnotationView(annotation: nil, reuseIdentifier: nil)
let pinImage = pinView.image
let point = snapshot?.point(for: location)
pinImage?.draw(at: point!)
}
return finalImage.pngData() // This line is needed to be returned by the function
}
}`
xcode swiftui mapkit
1个回答
0
投票

我已经用下面的代码片段解决了这个问题:

func generateImageSnapshot(location: CLLocationCoordinate2D, width: CGFloat, height: CGFloat, completion: @escaping (Data?) -> Void) {
        let options = MKMapSnapshotter.Options()
        options.camera = MKMapCamera(lookingAtCenter: location, fromDistance: 300, pitch: 0, heading: 0)
        options.mapType = .standard
        options.size = CGSize(width: width, height: height)
        let snapshotter = MKMapSnapshotter(options: options)
        snapshotter.start { snapshot, error in
            guard let snapshot = snapshot, error == nil else {
                completion(nil)
                return
            }
            let mapImage = snapshot.image
            let finalImage = UIGraphicsImageRenderer(size: options.size).image { _ in
                mapImage.draw(at: .zero)
                _ = MKPinAnnotationView(annotation: nil, reuseIdentifier: nil)
                let pinImage = UIImage(systemName: "mappin")
                let point = snapshot.point(for: location)
                pinImage?.draw(at: point)
            }
            let imageData = finalImage.pngData()
            completion(imageData)
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.